我上这堂课,只是为了学习:
public class MyClass{ //Looking for a solution without making my class also generic <Type>
//Private Arraylist var to hold the value called myvar
public MyClass(ArrayList<MyDesiredType> incoming) {
//CODE myVar=incoming
}
public MyDesiredType getType() {
return myVar.get(0);
}
}
有没有什么办法可以将传入的对象从构造函数推断为方法的返回类型,而不会发出警告和强制转换以及失去类型安全性,但是最重要的是,没有使整个类成为GENERIC(对我来说似乎很多余)?如果没有,为什么我认为这对编译器不可行?
这是我已经做过的重新表述的问题,但这是我的第一个问题,由于没有人了解,我学会了如何将其公开。后来我尝试编辑原始问题,但所有内容都被掩埋了。我更改并简化了示例,并尝试使其变得简单。原始问题:Java Generics Silly Thing (Why cant I infer the type?)。
如果有任何问题,请告诉我,我将其删除。
最佳答案
不,那里没有。编译器将如何知道要返回什么类型?在编译期间将不知道构造函数中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设为通用时,第二个不编译。在使用默认构造函数的情况下,编译器如何确定的类型?
此外,这可能会导致集合中的Object出现严重问题,该集合依赖于仅插入某些类型的事实。
这将生成以下异常:
Exception in thread "main" java.lang.ClassCastException:
java.lang.Object cannot be cast to java.lang.String at
Test.main(Test.java:27)
我说服了吗?
真是个好问题,顺便说一句。我不得不考虑这一点。