未绑定通配符和原始类型之间的区别

2022-09-01 06:42:55

我正在阅读有关泛型的文章,我不明白对未绑定通配符的需求以及它与原始类型的区别。我读了这个问题,但仍然没有清楚地理解。在未绑定通配符的Java教程页面中,我得到了以下两点,我不明白第一点:

  • 如果您正在编写一个可以使用类中提供的功能实现的方法。Object
  • 当代码使用泛型类中不依赖于 type 参数的方法时。例如,或 .实际上,之所以经常使用,是因为 中的大多数方法都不依赖于 。List.size()List.clear()Class<?>Class<T>T

有人可以解释一下外行语言中未绑定通配符和原始类型之间的区别吗?

与 有何不同?List<?>List<Object>


答案 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);

答案 2

与 有何不同?List<?>List<Object>

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

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


推荐