未结合的通配符和原始类型之间差异(Difference between an unbound wil

2019-07-18 00:59发布

我正在读关于仿制药,我不理解绑定通配符的需要,以及如何从原始类型不同。 我读了这个问题 ,但仍没有得到很清楚。 在对未绑定的通配符的Java教程页面我有以下两点,我不明白第一点:

  • 如果你正在写,可以使用所提供的功能来实现的方法Object类。
  • 当代码是使用不依赖于类型参数的泛型类的方法。 例如, List.size()List.clear() 事实上, Class<?>被如此经常使用,因为大多数的所述方法中Class<T>不依赖于T

有人可以解释未绑定的通配符和原始类型在深入浅出之间的差异。

如何List<?>从不同List<Object>

Answer 1:

如何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);


Answer 2:

如何List<?>不同于List<Object>

    List<Object> l1 = new ArrayList();
    List<?> l2 = new ArrayList();
    l1.add("Object");
    //l2.add("Object");   incorrect
    l2.add(null);

您只能空值添加到List<?>



Answer 3:

就个人而言,我发现这个从通配符Java教程附加链接的帮助。

有一个问题我之间看到的主要区别List<?>List的是,前者永远只能是有益的,从它的元件读取(除非你真的想加null ),后者允许(未选中)将任意类型的对象的它有可能是意想不到的副作用。



Answer 4:

有人可以解释未绑定的通配符和原始类型在深入浅出之间的差异。

未绑定的通配符类型可以保持集合的类型不变 ,和原始类型不能。 由于约书亚·布洛克说,在他的有效的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;


Answer 5:

列表是一个方法签名用于调用,从来没有需要的类型参数,即,从列表中读取或旋转它的方法,例如。

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


文章来源: Difference between an unbound wildcard and a raw type