我实例化以下列表:
// I am just revising generics again and the following is just cursory code!
List<? super Integer> someList = new ArrayList<Object>();
someList.add(new Object());
Run Code Online (Sandbox Code Playgroud)
以上不起作用.我收到编译器错误.但是,以下工作:
List<? super Integer> someList = new ArrayList<Object>();
someList.add(11);
Run Code Online (Sandbox Code Playgroud)
我知道您可以将对象添加到包含无界通配符的集合中,而不是有界通配符.
但是,为什么以上不起作用?Object是Integer的超类型,为什么我不能添加它?
这声明它是一个超类型的东西的列表,而不是列表可以包含任何超类型的整数.换句话说,对于编译器,它可能是a List<Integer>
,a List<Number>
或a List<Object>
,但它不知道哪个,所以你不能只为List添加任何东西.你唯一可以安全添加的是Integer,因为它保证是List可能拥有的任何类型的子类型.
换句话说,?
代表一种类型,而不是任何类型.这是一个非显而易见但重要的区别.
归档时间: |
|
查看次数: |
1596 次 |
最近记录: |