java泛型疑问

来源:百度知道 编辑:UC知道 时间:2024/06/08 06:22:04
class Holder<T> {
private T value;
public Holder() {}
public Holder(T val) { value = val; }
public void set(T val) { value = val; }
public T get() { return value; }
public boolean equals(Object obj) {
return value.equals(obj);
}
} /* Output: (Sample)
java.lang.ClassCastException: Apple cannot be cast to Orange
true
*///:~

public class Wildcards {
static <T> T wildSubtype(Holder<? extends T> holder, T arg) {
T t = holder.get();
return t;
}
static <T> void wildSupertype(Holder<? super T> holder, T arg) {
holder.set(arg);

Object obj = holder.get();
}
public static void main(String[] args) {

Holder<?> unbounded = new Holder<Long>();
Long lng = 1L;

Object r11 = wildSubtype(unbounded, lng);

// wildSupertype(unbounded, lng); // Error:

} ///:~
为什么wild

抱歉,前面没搞清楚,现在修正一下,关于包装类

看这句
static <T> T wildSubtype(Holder<? extends T> holder, T arg)
这句表示 wildSubtype 第一个参数必须是 Holder<T的子类或本身>
static <T> void wildSupertype(Holder<? super T> holder, T arg)
这句表示 wildSupertype 第一个参数必须是Holder<T的超类>

调用
wildSubtype(unbounded, lng);
时候,lng本身是简单数据类型
我查了一些文档,这时候T实际上被认为是Object

unbounded = new Holder<Long>

所以unbounded作为参数1没问题,因为满足Long extends Object

而wildSupertype则不行,因为Long super Object不满足

solotimes 说得不对
我再定义一个
Holder<Long> abc = new Holder<Long>();
调用wildSupertype(abc, lng);
按照你说的,也该是Long super Long,应该错误,但是明显这是可以行得通的

solotimes 说得还是不对
还是用上面的例子
Holder<Long> abc = new Holder<Long>();
调用wildSupertype(abc, lng);
按照你说的,也该是Long super Object,应该错误,但是明显这是可以行得通的

这个例子 unbounded 关键看前面
Holder<?> unbounded = new Holder<