我正在阅读关于泛型的内容,我不明白是否需要未绑定的通配符以及它与原始类型的区别.我读了这个问题,但仍然没有弄清楚.在未绑定的通配符的 Java教程页面中,我得到了以下两点,我没有理解第一点:
- 如果您正在编写可以使用
Object类中提供的功能实现的方法.- 当代码使用泛型类中不依赖于类型参数的方法时.例如,
List.size()或List.clear().事实上,Class<?>经常使用,因为大多数方法Class<T>都不依赖T.
有人可以用外行语言解释未绑定的通配符和原始类型之间的区别.
有List<?>什么不同List<Object>?
我认为由于类型擦除,使用instanceof和class literals不允许parameterized generic types除外unbounded wild card types.为什么Java语言设计者允许这种异常?对于无界外卡类型,没有类型擦除的任何作用?
我读了几篇帖子,比如这里,但我无法找到解决问题的方法.
为什么我无法添加d?它是Object的子类型... d的类型:A<B<X>>
List<A<B<? extends Object>>> rv=new LinkedList<>();
rv.add(d); //not working
Run Code Online (Sandbox Code Playgroud)
编辑
我试图简化问题.当我做:
A<B<?>> abcv=new A<B<String>>();
Run Code Online (Sandbox Code Playgroud)
我收到错误:类型不匹配:无法转换 A<B<String>> to A<B<?>>
但是,String与"?"兼容 - 那为什么不工作?我想在列表中添加元素,其中最后一个类型可以是任何东西,如下所示:
List<A<B<?>>> rv=new LinkedList<>();
rv.add(new A<B<X>>());
rv.add(new A<B<String>>());
rv.add(new A<B<Integer>>());
Run Code Online (Sandbox Code Playgroud) 希望在了解通用边界之后,我尝试了解通配符上限和下限。我的参考是: https: //docs.oracle.com/javase/tutorial/java/generics/wildcards.html 我发现有一句话我能理解:“通配符可以在多种情况下使用:作为参数、字段或局部变量; “字段和局部变量?无法想象。为什么如此重要的来源不通过一个简单的例子来强调它?
我试图了解 java 编译器用哪个引用来替换(同时擦除)“?”。也许我有一个很大的误解,并且会发生任何删除(因此以下所有示例都不相关)。在下面的例子中: 1.
public static void funcA (List<? extends Number>l)
Run Code Online (Sandbox Code Playgroud)
2.
public static void funcB(List<? super Integer>l)
Run Code Online (Sandbox Code Playgroud)
第二个示例和以下代码之间有区别吗: 3.
public static <T extends Integer> funcC(List<? extends T>l)
Run Code Online (Sandbox Code Playgroud)
示例2与下面的示例是否有不同: 4.
public static <T extends Integer> void funcC(List<T>l)
Run Code Online (Sandbox Code Playgroud)