小编典典

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中不起作用?相关推荐

  1. java parcelable_Android中Parcelable的作用实例解析

    这篇文章主要介绍了Android中Parcelable的作用,对于Android初学者有一定的参考学习价值,需要的朋友可以参考下 在android提供了一种类型:Parcel.被用作封装数据的容器,封 ...

  2. Java 构造方法中super()的作用以及使用

    在类的继承中,子类的构造方法中默认会有super()语句存在,相当于执行父类的相应构造方法中的语句 如下面代码: class Extends_Demo {public static void main ...

  3. java 循环标记_深入浅析Java 循环中标签的作用

    continue和break可以改变循环的执行流程,但在多重循环中,这两条语句无法直接从内层循环跳转到外层循环.在C语言中,可以通过goto语句实现多重循环的跳转,但在非循环结构中使用goto语句会使 ...

  4. java重载中this的作用_Java2:构造方法、方法重载和this关键字

    上一篇博客小编已经给读者介绍了Java入门的类与对象,这一章节我们来了解一下构造方法,方法重载以及this关键字. 一:构造方法 Java中方法一般有2中:普通方法和构造方法.我们已经知道普通方法的声 ...

  5. java sql封装,在Java系统中封装SQL语言的处理方法及系统的制作方法

    在Java系统中封装SQL语言的处理方法及系统的制作方法[ 技术领域: ][0001]本发明涉及计算机数据处理 技术领域: ,特别是涉及一种在Java系统中封装SQL语言的处理方法及系统.[ 背景技术 ...

  6. eclipse中clean的作用

         1.eclipse  --->project  ----->clean... 选项       将工程中的.class文件删除,同时重新编译工程(Java文件),类似于jbuil ...

  7. java定义常量语法错误的是_在Java接口中定义常量,下面语法错误的是( )_学小易找答案...

    [单选题]Why did Ben's emotions change so much? [判断题]Write the title in the middle of the first line. [单 ...

  8. java lt t gt 是什么意思_关于泛型:Java 7中的菱形运算符(&lt;&gt;)有什么意义?...

    Java 7中的菱形操作符允许如下代码: List list = new LinkedList<>(); 然而,在Java 5/6中,我可以简单地写: List list = new Li ...

  9. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  10. Java开发中Websocket的技术选型参考

    1. 前言 Websocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 ...

最新文章

  1. php引用php,PHP7引入的??和?:的区别讲解
  2. SAP PM 初级系列26 - 设备功能位置的Document
  3. redis-rdb-tools来解析分析reids dump文件及内存使用量
  4. react 与 Vue的一些比较
  5. JavaScript Date(日期)对象
  6. java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter
  7. MySQL报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents .....
  8. Android适配64位TBS X5内核
  9. Jmeter之web压力测试
  10. netbeans java桌面应用程序_java – 使用Netbean的桌面应用程序的状态栏
  11. MySQL数据备份与恢复及sql语句使用方法
  12. Presenting view controllers on detached view controllers is discouraged的解决方案
  13. 【1】机器人手眼标定:固定向上相机
  14. Mysql Workbench connection ssl not enable问题解决
  15. Unity游戏快速制作特效
  16. 教你一分钟实现动态模糊效果
  17. 4、PIC32系列 GPIO介绍
  18. python写入文件没反应_python写入文本 如何用python将变量及其值写入文本文件?...
  19. iOS - mac环境Jenkins自动化打包并上传蒲公英分发从0到1详细搭建过程,自我的实践记录
  20. 腾讯CSIG-腾讯云-后台开发-面经(已拿offer)

热门文章

  1. Android 上架应用市场整理
  2. Character与char的区别
  3. 服务器版系统和w7区别,小编告诉大家W7精简版和旗舰版啥区别
  4. 苹果邮箱登录入口_电子邮箱的申请及使用说明
  5. 基于学习的方法决定在哪些分支节点上运行heuristic算法
  6. ESP32 HTTP Client接口使用
  7. 计算机系的对联,轻松写对联 微软亚洲研究院推出电脑对联
  8. C语言编程-对数字进行分类
  9. 招商银行笔试题之鸡鸭分类问题
  10. linux开启80和443,nginx 80和443同时做负载均衡