试图将"Hello"添加到具有数字下限的列表中.

这不起作用(如预期):

List<? super Number> numList = new ArrayList<>();
numList.add(1);
numList.add(3.0);
numList.add("hello"); // <--- fails here with ('add(capture<? super java.lang.Number>)' in 'java.util.List' cannot be applied to '(java.lang.Object)')

这很管用(为什么管用?):

List<? super Number> numList = Arrays.asList(1, 2, 3.0, "hello"); 

注意:numList的下限是数字,而"Hello"是一个字符串.

推荐答案

因为Arrays.asList()返回一个可串行化的列表"而‘Hello’是可串行化的",所以没有问题

所以这就是

List<? super Number> numList = Arrays.asList(1, 2, 3.0, "hello");

就像

List<? super Number> numList = new ArrayList<Serializable>();

这在编译时是可接受的,因为Number实现了Serializable.(从超级类到子类的选角)

要使其不起作用,您需要告诉Arrays.asList()返回如下数字列表

List<? super Number> numList = Arrays.<Number>asList(1, 2, 3.0, "hello");

Edit:

Arrays.asList().幕后发生的事情是来自doctor 的

Java编译器查看每个方法调用和相应的声明,以确定使调用适用的一个或多个类型参数.推理算法确定参数的类型,以及分配或返回结果的类型(如果可用).最后,推理算法试图找到与所有参数一起工作的最具体的类型.

你可以找到更多的例子here

Java相关问答推荐

使用json参数通过单击jSP文件中的按钮来运行server时出现问题

Jooq隐式地将bigint转换为数字,并且索引不起作用

无法运行Java(已解决)

Spring安全实现多个SQL表身份验证

使用Apache Poi MQLSlideShow,在XSLFTable表中,我们可以在文本段落后面的每个单元格中包含圆角矩形吗?

H2弹簧靴试验跌落台

在AnyLogic中增加变量计数

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

Java .类参数不通过构造函数传递

Log4j与jdk21兼容吗?

在settings.gradle.kts和Build.gradle.kts中使用公共变量

try 使用类来包含JSON响应

AbstractList保证溢出到其他方法

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

为什么没有加载java.se模块?

为什么我的登录终结点不能被任何请求访问?

当我将鼠标悬停在javafxTextArea上时,如何更改鼠标光标?

Maven创建带有特定类的Spring Boot jar和普通jar

可以';不要在Intellij IDEA中使用最新的Java版本(JDK 21)