Jos*_*ley 7 java generics declaration wildcard instantiation
前几天我正在审查其他人的代码,我遇到了引起一些担忧的问题.为了简化,我说我有一个通用的A类和一个抽象的B类.是否允许以下实例化,如果允许,为什么?
Object obj = new A<? extends B>();
Run Code Online (Sandbox Code Playgroud)
我个人从来没有见过像上面这样的实例化,虽然这样的声明如
A<? extends B> obj = null;
Run Code Online (Sandbox Code Playgroud)
肯定会持有.我总是在泛型中使用通配符来声明方法参数,所以我可能没有经验.
实际上new A<? extends B>()并不能编译。自 Java 5 以来,它一直是非法的。
但我猜你原来的例子是这样的new A<X<? extends B>>()。后者在最新版本的 Java 中是合法的。
这个想法是,在实例化对象时,类型参数的值可以是任何非通配符类型。? extends B是通配符类型,因此不允许使用。ButX<? extends B>不是通配符类型,尽管它具有通配符类型作为组件。所以你可以说合法地打电话new A<X<? extends B>>()。
如果你这样想的话,这些规则就有意义了。最终,它是更基本规则的副产品,即通配符类型? extends B不能是字段或变量的声明类型。如果A定义为
class A<T> {
T value;
}
Run Code Online (Sandbox Code Playgroud)
那么假设new A<? extends B>().value是一个声明为类型的 ? extends B字段。既然这是非法的,那么实例化也是非法的。但new A<X<? extends B>>()不存在这个问题。
| 归档时间: |
|
| 查看次数: |
1417 次 |
| 最近记录: |