我有2节课如下.根据我的理解,编译器不能在第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
}
}
Run Code Online (Sandbox Code Playgroud)
问题如下:
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(); 不编译,与上面的行相同的原因| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |