我有两个课程如下。根据我的理解,编译器不能在第4行(类WildCard)抱怨,因为我的参数化类型是(节点?超级数> 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 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
}
}
答案 0 :(得分:5)
问题如下:
Node<? super Number>
表示您可以使用Node
类型的参数或超类型传递任何Number
,例如Object
。
由于您不知道该通用参数的确切类型,因此不允许执行某些操作。
这里有一些简短的细分为什么有些行编译而有些则没有:
s0.setData(object);
无法编译,因为您可能有一个Node<Number>
并不是所有人都可以添加任意对象s0.setData(number);
编译,因为Number
匹配参数的所有可能类型 s0.setData(integer);
编译,因为Integer
扩展了Number
,因此适用上述行
object=s0.getData();
编译因为任何数据对象都延伸Object
,总是
number=s0.getData();
无法编译,因为您可以拥有Node<Object>
,因此数据对象可能具有不同的类型(例如String
)integer=s0.getData();
无法编译,原因与答案 1 :(得分:0)
Java语言规范说:
可以为通配符提供明确的界限,就像常规类型一样 变量声明。上限表示如下 语法,其中
B
是绑定的:
? extends B
与方法签名中声明的普通类型变量不同,没有类型 使用通配符时需要推断。因此,它是 允许在通配符上声明下限,使用以下内容 语法,其中
B
是下限:
? super B
Reference(T referent, ReferenceQueue<? super T> queue);
这里,可以将引用对象插入到元素类型为超类型的任何队列中
输入引用的T
; T
是通配符的下限。