我发现List<?>并List<? extends Object>以同样的方式行事.至于我,它们之间没有区别.如果我不对,你能解释一下我的区别吗?
import java.util.ArrayList;
import java.util.List;
public class TestClass {
static void func1(List<?> o, Object s) {
o.add(null); // only null
o.add(s); // wrong
o.get(0); // OK
}
static void func2(List<? extends Object> o, Object s) {
o.add(null); // only null
o.add(s); // wrong
o.get(0); // OK
}
public static void main(String[] args) {
func1(new ArrayList<String>(), new Integer(1));
func2(new ArrayList<String>(), new Integer(1));
List<? extends Object> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<Object>();
List<? extends Object> list3 = new ArrayList<String>();
List<?> list4 = new ArrayList<String>();
}
}
Run Code Online (Sandbox Code Playgroud)
这很复杂...
对于任何类型变量T,规范说http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4
每个类型变量都有一个绑定.如果没有为类型变量声明绑定,则假定为Object.
人们会认为对于通配符也是如此,而且?应该只是一个简写? extends Object.
然而,在搜索规范时,根本没有证据表明通配符必须具有上限(或下限)."无界" ?与有界通配符的处理方式截然不同.
我们可以从子类型规则推断,这List<?>和List<? extends Object>是相互的,即亚型,它们是基本相同的类型.(推论取决于Ein interface List<E>具有隐式上限的事实Object;但规则不要求通配符上的边界)
然而,规范对待这两者的方式不同.例如http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7 List<?>是一个可重复的类型,但List<? extends Object>不是,这意味着
// ok
List<?>[] xx = {};
// fail
List<? extends Object>[] yy = {};
// ok
boolean b1 = (y instanceof List<?>);
// fail
boolean b2 = (y instanceof List<? extends Object>);
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.说通配符必须有上限和下限,默认为Object和null type.
| 归档时间: |
|
| 查看次数: |
15639 次 |
| 最近记录: |