我正在读关于仿制药,我不理解绑定通配符的需要,以及如何从原始类型不同。 我读了这个问题 ,但仍没有得到很清楚。 在对未绑定的通配符的Java教程页面我有以下两点,我不明白第一点:
- 如果你正在写,可以使用所提供的功能来实现的方法
Object
类。 - 当代码是使用不依赖于类型参数的泛型类的方法。 例如,
List.size()
或List.clear()
事实上, Class<?>
被如此经常使用,因为大多数的所述方法中Class<T>
不依赖于T
。
有人可以解释未绑定的通配符和原始类型在深入浅出之间的差异。
如何List<?>
从不同List<Object>
?
如何List<?>
不同于List<Object>
主要的区别是,第一行编译,但第二个没有:
List<?> list = new ArrayList<String> ();
List<Object> list = new ArrayList<String> ();
然而,因为你不知道什么泛型类型的List<?>
是,你不能使用它的参数化方法:
List<?> list = new ArrayList<String> ();
list.add("aString"); //does not compile - we don't know it is a List<String>
list.clear(); //this is fine, does not depend on the generic parameter type
作为与原始类型(无泛型)之差,以下编译和代码细运行:
List list = new ArrayList<String> ();
list.add("aString");
list.add(10);
如何List<?>
不同于List<Object>
List<Object> l1 = new ArrayList();
List<?> l2 = new ArrayList();
l1.add("Object");
//l2.add("Object"); incorrect
l2.add(null);
您只能空值添加到List<?>
就个人而言,我发现这个从通配符Java教程附加链接的帮助。
有一个问题我之间看到的主要区别List<?>
和List
的是,前者永远只能是有益的,从它的元件读取(除非你真的想加null
),后者允许(未选中)将任意类型的对象的它有可能是意想不到的副作用。
有人可以解释未绑定的通配符和原始类型在深入浅出之间的差异。
未绑定的通配符类型可以保持集合的类型不变 ,和原始类型不能。 由于约书亚·布洛克说,在他的有效的Java,
你可以把任何元件到收集与原料类型,容易破坏集合的类型不变(这表现在112页上的unsafeAdd方法); 你不能把(null以外)的任何元素插入一个Collection <?>。
所以,只要你指定的参数类型绑定通配符类型的列表,列表, 收藏的类型不变将保持不变。
List<String> list1 = new ArrayList();
list1.add("foo");
list1.add("bar");
List<?> list2 = list1;
如果分配原始类型的元素是不同类型的列表,未绑定的通配符类型将不保持集合的类型不变 ,因为该列表是最初类型变种。
List list1 = new ArrayList();
list1.add(1);
list1.add("foo");
List<?> list2 = list1;
列表是一个方法签名用于调用,从来没有需要的类型参数,即,从列表中读取或旋转它的方法,例如。
void someMethod(List<?> list) {
list.clear(); // I will never add anything to the list in here
}
你永远不会添加任何东西或修改列表相对于它拥有你不能到列表中,除了空与此签名的方法添加任何东西,因此你永远不会打破类型安全的类型。 在另一方面,你可以做任何事情,这大家都知道可能会导致一种违反安全初始名单。
void someMethod2(List list) {
list.add(new WeaselFurBrush());
}
List list1 = new ArrayList<String>();
someMethod2(list1);// oops