diamond java_Diamond语法何时在Java 8中不起作用?
小编典典
Diamond运算符不能总是在Java 8中使用。最初的改善Java 8推理的计划(JEP
101)有两个目标:
在方法上下文中添加对方法类型参数推断的支持
添加对链式调用中方法类型参数推断的支持
仅第一个实施。从JEP借用该示例,请考虑以下类:
class List {
static List cons(Z head, List tail) { ... };
E head() { ... }
}
在Java 8中,改进的方法上下文推论允许以下内容进行编译。使用Java 7,它将因错误而失败expected List, found
List
List l = List.cons(42, new List<>());
但是,需要推理链式调用的示例仍无法在Java 8中使用:
Integer i = new List<>().head();
JSR 335的
D部分包含有关Java 8为什么放弃链式表达式推理的提示:
允许推理到“链”已经引起了一些兴趣:在a()。b()中,将类型信息从b的调用传递到a的调用。由于部分信息必须在两个方向上传递,这为推理算法的复杂性增加了另一个维度。它仅在所有实例化(例如List)的a()返回类型的擦除固定后才起作用。由于无法轻松导出目标类型,因此该功能不太适合多表达式模型。但也许有其他增强功能可以在将来添加。
还有一些更人为的例子,其中不能使用钻石。
如果算错了,那么jdk8u25之前的javac不会编译它。(请参阅JDK-8029002)
class Test {
class C> {}
void m() {
C> i = new C<>();
}
}
error: incompatible types: cannot infer type arguments for Test.C<>
C> i = new C<>();
^
reason: inferred type does not conform to upper bound(s)
inferred: Test.C
upper bound(s): Test.C>,Test.C
where CAP#1 is a fresh type-variable:
CAP#1 extends Test.C from capture of ?
新类型的推理实现还存在一个性能问题(JDK-8051946),该问题可能会影响使用菱形运算符的代码。如果使用菱形运算符,下面的示例将花费几分钟的时间进行编译。
class Test {
T and(T a, T b) { return null; }
class C {}
void g(String s) {}
void g(Object s) {}
void m() {
g(
and(
and(
and(
and(
and(
and(
and(new C<>(),
new C<>()),
new C<>()),
new C<>()),
new C<>()),
new C<>()),
new C<>()),
new C<>()));
}
}
2020-11-16
diamond java_Diamond语法何时在Java 8中不起作用?相关推荐
- java parcelable_Android中Parcelable的作用实例解析
这篇文章主要介绍了Android中Parcelable的作用,对于Android初学者有一定的参考学习价值,需要的朋友可以参考下 在android提供了一种类型:Parcel.被用作封装数据的容器,封 ...
- Java 构造方法中super()的作用以及使用
在类的继承中,子类的构造方法中默认会有super()语句存在,相当于执行父类的相应构造方法中的语句 如下面代码: class Extends_Demo {public static void main ...
- java 循环标记_深入浅析Java 循环中标签的作用
continue和break可以改变循环的执行流程,但在多重循环中,这两条语句无法直接从内层循环跳转到外层循环.在C语言中,可以通过goto语句实现多重循环的跳转,但在非循环结构中使用goto语句会使 ...
- java重载中this的作用_Java2:构造方法、方法重载和this关键字
上一篇博客小编已经给读者介绍了Java入门的类与对象,这一章节我们来了解一下构造方法,方法重载以及this关键字. 一:构造方法 Java中方法一般有2中:普通方法和构造方法.我们已经知道普通方法的声 ...
- java sql封装,在Java系统中封装SQL语言的处理方法及系统的制作方法
在Java系统中封装SQL语言的处理方法及系统的制作方法[ 技术领域: ][0001]本发明涉及计算机数据处理 技术领域: ,特别是涉及一种在Java系统中封装SQL语言的处理方法及系统.[ 背景技术 ...
- eclipse中clean的作用
1.eclipse --->project ----->clean... 选项 将工程中的.class文件删除,同时重新编译工程(Java文件),类似于jbuil ...
- java定义常量语法错误的是_在Java接口中定义常量,下面语法错误的是( )_学小易找答案...
[单选题]Why did Ben's emotions change so much? [判断题]Write the title in the middle of the first line. [单 ...
- java lt t gt 是什么意思_关于泛型:Java 7中的菱形运算符(&lt;&gt;)有什么意义?...
Java 7中的菱形操作符允许如下代码: List list = new LinkedList<>(); 然而,在Java 5/6中,我可以简单地写: List list = new Li ...
- abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- Java开发中Websocket的技术选型参考
1. 前言 Websocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 ...
最新文章
- php引用php,PHP7引入的??和?:的区别讲解
- SAP PM 初级系列26 - 设备功能位置的Document
- redis-rdb-tools来解析分析reids dump文件及内存使用量
- react 与 Vue的一些比较
- JavaScript Date(日期)对象
- java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
- MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents .....
- Android适配64位TBS X5内核
- Jmeter之web压力测试
- netbeans java桌面应用程序_java – 使用Netbean的桌面应用程序的状态栏
- MySQL数据备份与恢复及sql语句使用方法
- Presenting view controllers on detached view controllers is discouraged的解决方案
- 【1】机器人手眼标定:固定向上相机
- Mysql Workbench connection ssl not enable问题解决
- Unity游戏快速制作特效
- 教你一分钟实现动态模糊效果
- 4、PIC32系列 GPIO介绍
- python写入文件没反应_python写入文本 如何用python将变量及其值写入文本文件?...
- iOS - mac环境Jenkins自动化打包并上传蒲公英分发从0到1详细搭建过程,自我的实践记录
- 腾讯CSIG-腾讯云-后台开发-面经(已拿offer)