St.*_*rio 1 java generics wildcard
代码:
List<? extends Integer> ints= new ArrayList<Integer>();
ints.add(3);//error
Run Code Online (Sandbox Code Playgroud)
我仍然不明白它是如何工作的。题:
什么意思CAP#1?它是引用类型吗?我认为,不,因为 CAP#1 不是从Object. 我们可以编写ints.add(null);//OK并且我们没有编译时错误。但是我们不能写null instanceof CAP#1;//compile-time error。为什么我们不能实例化CAP#1:
CAP#1 c= new CAP#1();
Run Code Online (Sandbox Code Playgroud)
从什么CAP#1看来?
CAP#1是由“ ?”表示的隐式类型变量的编译器名称。没有这样的命名类型,但编译器需要为该类型创建一个占位符才能完成其工作。这个名字代表“捕获”。
它有助于在精神上重写类似G<? extends T>to的类型?CAP#1 extends T: G< CAP#1 >。
您不能向具有通配符扩展类型的列表添加任何内容,因为您不知道该通配符代表什么。就像不能将 a 添加Snake到 a 一样List< Mammal >,也不能将其添加到 a ,List< ? extends Animal >因为这?可能会代表Mammal。
但是,您始终可以null在这种情况下添加,因为null它实际上是每个引用类型的成员,这必然包括?可能表示的任何内容。
我经常想知道为什么 Java 不将List< ? extends F >某些最终类型F与List< F >. 也许是因为F它本身可能是一个通用的通配符类型,这意味着它仍然可以有任意多个子类型。
除了 Angelika Langer 关于 Java 泛型的著名 FAQ,我一直在我自己的列表中编译一些关于它们的内容。
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |