不,那里没有。编译器如何知道要返回什么类型?构造函数中 ArrayList 的泛型类型在编译期间将不知道。您要么必须使整个类通用,要么采用另一种方法。
考虑一下:
public class Test {
public static void main(String[] args) {
List<String> arrList = new ArrayList<String>();
arrList.add("FOO");
Test test = new Test(arrList);
String testStr = test.returnWhat();
System.out.println("testStr");
}
private final List myList; //warning
public <T> Test(List<T> ttype) {
myList = ttype;
}
public <T> T returnWhat() {
return (T) myList.get(0); //warning
}
}
这可行,但会在标记行上为您提供警告。所以,如果不使整个类通用,真的没有办法实现你所描述的。因为,如果:
public class Test {
public static void main(String[] args) {
List<String> arrList = new ArrayList<String>();
arrList.add("FOO");
Test test = new Test(); // now what?
String testStr = test.returnWhat(0); // no warning...
JPanel p = test.returnWhat(0); // goes through without warning, real nice...
test.returnWhat(0); // returns Object
Test test2 = new Test(arrList);
test2.addElement(new Object()); // boom, inserted object into list of string.
String nono = test2.returnWhat(1); // the universe goes down. assign an object to string without warning. even
// though one COULD think the class is generic.
}
// private List<T> myList = new ArrayList<T>(); compiler error, T is unknown
private List myList = new ArrayList();
public Test() {
myList.add(new Object());
}
public <T> Test(List<T> ttype) {
myList = ttype;
}
public <T> T returnWhat(int index) {
return (T) myList.get(index);
}
public <T> void addElement(T el) {
myList.add(el);
}
}
当 myList 被设为通用时,第二个不会编译。在使用默认构造函数的情况下,编译器如何确定 <T> 的类型?
此外,这可能会导致依赖于仅插入某些类型这一事实的集合中的对象出现严重问题。
这将产生以下异常:
Exception in thread "main" java.lang.ClassCastException:
java.lang.Object cannot be cast to java.lang.String at
Test.main(Test.java:27)
我说服你了吗?
真的很好的问题,顺便说一句。我不得不考虑这个问题。