Java 7钻石操作符和派生类的初始化
class A {} class B extends A {} class Holder<T> { T object; Holder(T object) { this.object = object; } } 有一个Holder类来保存一些使用泛型创建的对象. public static void main(String[] args) { Holder<A> holder = new Holder<>(new B()); } 但是,如果在右侧部分指定了基本类型,它将编译并运行: public static void main(String[] args) { Holder<A> holder = new Holder<A>(new B()); } 为什么?钻石运算符是否使用与左侧相同的类型参数定义赋值的右侧部分? 解决方法
首先观察:
Holder<B> h = new Holder<>(new B()); 用Java 8和Java 7编译,并且都创建Holder< B>在那种情况下.所以使用<>使用带参数的构造函数很好. 然而: Holder<A> h = new Holder<>(new B()); > Java 7首先评估右侧,确定它是Holder< B>.并给出编译错误,因为a 更详细地说,Java 8的改进是由于引入了poly expressions(强调我的):
这是Java 8的一个非常强大的功能(Java 7仅提供不考虑表达式上下文的独立表达式). 泛型类实例创建是一个多义表达式,JLS #15.9解释(强调我的):
由于新的规则,Java 8允许您使用上面的第二种形式,并自动推断新的B()应该被视为A(加宽参考转换),并且您打算创建一个Holder< A>.在这种情况下. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |