Java 关于通配符参数化类型的混淆
我有两门课,如下所示。据我所知,编译器不能抱怨第4行的类通配符,因为我的参数化类型是Node?超级编号>s0,因为对象在参数化类型中是超级编号。但编译器在4、8和9处抱怨。为什么会这样Java 关于通配符参数化类型的混淆,java,generics,Java,Generics,我有两门课,如下所示。据我所知,编译器不能抱怨第4行的类通配符,因为我的参数化类型是Node?超级编号>s0,因为对象在参数化类型中是超级编号。但编译器在4、8和9处抱怨。为什么会这样 public class Node<E> { private E data; public void setData(E obj) { data = obj; } public E getData() { return data;
public class Node<E> {
private E data;
public void setData(E obj) {
data = obj;
}
public E getData() {
return data;
}
}
public class WildCard {
static void checkIt(Node<? super Number> s0)
{
Object object=new Object(); //1
Number number =1.5; //2
Integer integer=10; //3
s0.setData(object); //4
s0.setData(number); //5
s0.setData(integer); //6
object=s0.getData(); //7
number=s0.getData(); //8
integer=s0.getData(); //9
}
}
Java语言规范规定:
可以为通配符指定显式边界,就像常规类型一样
变量声明。上限由以下内容表示:
语法,其中B是绑定:
??延伸B
与方法签名中声明的普通类型变量不同,没有类型
使用通配符时需要进行推断。因此,它是
允许使用以下命令声明通配符的下限
语法,其中B是下限:
??超级B
这里,可以将referent插入到元素类型为
所指对象的类型T;T是通配符的下界。Java语言规范说:
可以为通配符指定显式边界,就像常规类型一样
变量声明。上限由以下内容表示:
语法,其中B是绑定:
??延伸B
与方法签名中声明的普通类型变量不同,没有类型
使用通配符时需要进行推断。因此,它是
允许使用以下命令声明通配符的下限
语法,其中B是下限:
??超级B
这里,可以将referent插入到元素类型为
所指对象的类型T;T是通配符的下界。问题如下:
Node问题如下: 节点
Reference(T referent, ReferenceQueue<? super T> queue);