日期:2014-05-20  浏览次数:20810 次

泛型问题:请教如下代码为什么会编译不通过?
import java.util.LinkedList;

public class Test123<T extends Object> extends LinkedList<T> {

/**
 * 
 */
private static final long serialVersionUID = 1L;

public boolean add(T obj) {
return (!contains(obj)) && (super.add(obj));
}

public void test(){
add(new String("uuu"));
}
}

eclipse报如下编译错误:
The method add(T) in the type Test123<T> is not applicable for the arguments (String)
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

import java.util.LinkedList;

public class Test123<T extends Object> extends LinkedList<T> {
private static final long serialVersionUID = 1L;

public boolean add(T string) {
return (!contains(string)) && (super.add(string));
}

public void test(){
add(new Object());
}

public static void main(){
Test123<Integer> test = new Test123<Integer>();
test.add(new Integer(2));
}
}


谢谢你的回复!
add(new Object());这样也编译通不过。

我的意思是说在test里面调用add这样的写法是错的,除了add(null)其它的都不行。泛型类的设计主要用于处理一些与类型无关的对象,但是你调用add(new X);就对类型有关了,因为X的类型还无法确定。

因为T的类型还无法确定,上面打错了。

谢谢你的回复!
T的上界是Object,在编译的时候至少可以确定T是Object或者Object的子类,在test()里面加入一个Object类型的对象应该是符合逻辑的吧?

我只想问你一个问题:
Integer i = new Object();
比如上面这行代码,Integer也是Object的子类。那么就可以把父类引用赋值给子类的引用了?
很明显编译不过。但是:
Integer i = (Integer)new Object();
这样没问题,但是你会得到一个转型异常。因为Object它不是一个Integer。
Test123<String> t = new Test123<>();
t.test();
t.add("abc");
现在T是String,你调用test的时候,就相当于把Object赋值给了String。但Object不是String。

如果你还不能理解,那我也帮不到了。