相关疑难解决方法(0)

未绑定通配符与原始类型之间的差异

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

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

有人可以用外行语言解释未绑定的通配符和原始类型之间的区别.

List<?>什么不同List<Object>

java generics unbounded-wildcard

23
推荐指数
4
解决办法
5820
查看次数

为什么instanceof运算符允许使用无界外卡类型而不允许使用Java中的其他参数化类型?

我认为由于类型擦除,使用instanceofclass literals不允许parameterized generic types除外unbounded wild card types.为什么Java语言设计者允许这种异常?对于无界外卡类型,没有类型擦除的任何作用?

java generics

6
推荐指数
1
解决办法
982
查看次数

使用两种类型将对象添加到通用列表

我读了几篇帖子,比如这里,但我无法找到解决问题的方法.

为什么我无法添加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)

java generics

5
推荐指数
1
解决办法
154
查看次数

java 类型擦除如何处理 '?'

希望在了解通用边界之后,我尝试了解通配符上限和下限。我的参考是: 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)

java generics type-erasure

3
推荐指数
1
解决办法
1916
查看次数

标签 统计

generics ×4

java ×4

type-erasure ×1

unbounded-wildcard ×1