热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java10var和捕获变量

如何解决《Java10var和捕获变量》经验,为你挑选了1个好方法。

我正在阅读JEP 286,但我不明白这一部分:

使用嵌套捕获变量捕获变量和类型会被投射到不提及捕获变量的超类型.此映射将捕获变量替换为其上限,并替换使用有界通配符提示捕获变量的类型参数(然后重复).这保留了传统上有限的捕获变量范围,这些变量仅在单个语句中考虑.

谁能让我在Java代码中具体说明它的含义?



1> Jorn Vernee..:

var 允许您推断不可表示的类型:

var x = new Object() {
    int i = 10;
};

System.out.println(x.i); // works; `x` has the non-denotable type of the annonymous class

理论上,这将允许您推断出通配符类型.但是这篇文章所说的是,这是不可能的,因为通配符被它的上限或者推断类型中的新捕获变量所取代.

以这段代码为例:

List l1 = new ArrayList<>();
l1.add("Hello");
List l2 = l1;

var x = l2.get(0);
l2.add(x); // error

在这里,而不是x推断到通配符的确切类型的类型,这将使​​最后一行编译.相反,它被推断为它的上限,这是Object,并且您得到(Eclipse)错误消息:

The method add(capture#2-of ?) in the type List is not applicable for the arguments (Object)

你可以在哪里看到的类型xObject.

那是一部分

此映射将捕获变量替换为其上限


第二部分

...并使用有界通配符替换提及捕获变量的类型参数

谈论这样的情况:

List l1 = new ArrayList<>();
l1.add("Hello");
List l2 = l1;
var l3 = l2; // type of 'l3' is List, but not the same '?' as 'l2'

l3.add(l2.get(0)); // error

这也不编译,因为类型l3与类型的类型不完全相同l2,这意味着返回l2.get(0)的类型与所需的类型不同l3.add(...).这里的错误是:

The method add(capture#2-of ?) in the type List is not applicable for the arguments (capture#3-of ?)

并且您看到两个捕获变量都是不同的,这意味着类型l3不完全是类型l2,但是l2推断类型中的类型的捕获变量被具有相同边界的通配符替换为新的然后创建捕获变量.

所以对于一个类型List,推断类型是List,然后编译器为该通配符创建一个新的捕获变量,产生List(尽管编号在实践中可能有不同的作用,关键是2个捕获变量是不同的).


@ xdevel2000`List <?>`是一个带有嵌套捕获变量的类型.所以对于`List `正在投影的超类型是`List <?>`(带通配符),然后编译器会为其创建一个新的捕获变量.
通配符不是正确的类型(它们没有成员,子类型,超类型等),因此捕获转换会在它们用作类型时将它们转换为类型变量.在像`l2.add(x)`这样的情况下,在搜索`l2`类型的成员时会发生捕获转换([List <?>`的成员是捕获转换后的成员](https:/ /docs.oracle.com/javase/specs/jls/se10/html/jls-4.html#jls-4.5.2))在类似`l2.get()`的情况下,[捕获转换特别适用于返回类型](https://docs.oracle.com/javase/specs/jls/se10/html/jls-15.html#jls-15.12.3).
推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
呆保保_369
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有