作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果有泛型node<E>
有两个操作,如 setData(E Type)
和 E getData()
让s0
是 node
的实例通过 node<? extends Number>
那为什么编译器不允许我使用 s0.setData(Number Type)
至少?我能理解为什么不允许其他类型但为什么不允许 setData
放入数字类型,因为我们确定节点的类型至少是数字?
我的代码是这样的:
class Node<E> {
private E data;
// ...
public void setData(E obj) { data = obj; } // (1)
public E getData() { return data; } // (2)
// ...
}
Node<? extends Number> s0 = new Node<Number>();
s0.setData(200); //this is not allowed why?
Node<Number> s0 = new Node<Number>();
s0.setData(100); //But this is allowed!
最佳答案
您已声明类型 a Node<? extends Number>
.您分配给它的内容是无关紧要的。
就编译器而言,它可能是以下任何一种:
Node<Integer>
Node<Float>
Node<Double>
而且它无法知道哪种类型是实际类型。
您正在尝试传递(自动装箱)Integer
, 但编译器不知道 actual 类型可以接受 Integer
.
关于java泛型歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15376515/
我是一名优秀的程序员,十分优秀!