我已经阅读了Angelika langer's Generics FAQ,其中讨论了在类型参数没有通配符的情况下的类型推断.

List<String> list2 = new ArrayList<>();// type inference

我明白你的意思.但在以下两种情况下会发生什么呢?

ArrayList<? super Number> list1 = new ArrayList<>();
ArrayList<? extends Number> list2 = new ArrayList<>();

上面的编译器推断出了哪些类型?为什么?

我也读了这个SO question,但它只讨论参数为List<?>的情况,而不是提供的例子.

推荐答案

这个问题在 comments 中有一个答案,基于这两个说法:

  • 不能对对象本身使用通配符,只能对变量、字段和参数使用通配符.

  • 如果没有显式的类型参数,它将使用super的上限或extends的下限.

我不明白这些结论是如何从JLS得出的.与此同时,这里有一个例子.

这两种情况都会创建一个列表.实现这一点的一种方法是创建一个匿名内部类.

ArrayList<? super Number> list1 = new ArrayList<>() {};
System.out.println(list1.getClass().getGenericSuperclass().getTypeName());

它将输出,

list1 ==> []
java.util.ArrayList<java.lang.Number>

在下限情况下,

ArrayList<? extends Number> list1 = new ArrayList<>() {};
System.out.println(list1.getClass().getGenericSuperclass().getTypeName());

以下哪项输出:

list1 ==> []
java.util.ArrayList<java.lang.Number>

Java相关问答推荐

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

是否保证在事务性块的末尾标记违反约束?

如何修复IndexOutOfBoundsException在ClerView适配器的onRowMoved函数?

如何在运行时动态创建表(使用Java、JPA、SprringBoot)

如何正确创建序列图?

如何让JavaFx应用程序识别依赖项?

尽管通过中断请求线程死亡,但线程仍将继续存在

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

Java Telnet客户端重复的IAC符号

是否在settings.xml中使用条件Maven镜像?

Oj算法 MatrixR032从字符串、归一化和余弦相似度计算创建

Java创建带有扩展通配符的抽象处理器

try 在两个不同数组的数字之间求平均值

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

Android Studio模拟器没有互联网

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

java 11上出现DateTimeParseException,但java 8上没有

JAVA 正则表达式识别字符串string或字符串内的字符char