我创建了以下测试类:
public class GenericTest {
public static class A implements Serializable {
}
public static class B implements Serializable {
}
public static void main(String[] args) {
// Error: Type mismatch: cannot convert from List<capture#1-of ? extends Serializable> to List<GenericTest.A>
//List<A> aList = getInfo().get("A");
//List<B> BList = getInfo().get("B");
// Warning: Type safety: Unchecked cast from List<capture#1-of ? extends Serializable> to List<GenericTest.A>
List<A> aList = (List<A>)getInfo().get("A");
List<B> BList = (List<B>)getInfo().get("B");
}
public static Map<String, List<? extends Serializable>> getInfo() {
Map<String, List<? extends Serializable>> infoMap = new HashMap<String, List<? extends Serializable>>();
List<A> aList = new ArrayList<A>();
List<B> bList = new ArrayList<B>();
try {
aList.add(new A());
infoMap.put("A", aList);
bList.add(new B());
infoMap.put("B", bList);
}
catch(Exception e) {
e.printStackTrace();
}
return infoMap;
}
}
有没有更好的方法来解决这个问题,以避免转换和抑制未经检查的警告?有人告诉我,使用强制类型转换几乎就违背了使用泛型的初衷。这有问题吗,或者有“更安全”的方法吗?
最佳答案
你可以尝试这样做。您仍然需要在 getList 方法中抑制警告,但如果您仅使用 addToMap 方法添加列表,编译器可以正确检查添加的列表是否与第一个参数中使用的类类型相同。还可以在 google 上搜索 super 类型 token 。
public static void main(String[] args) {
List<A> aList = new ArrayList<A>();
aList.add(new A());
List<B> bList = new ArrayList<B>();
bList.add(new B());
addToMap(A.class,aList);
addToMap(B.class,bList);
List<A> aListFromMap = getList(A.class);
List<B> bListFromMap = getList(B.class);
}
private static Map<Class<?>,Object> infoMap = new HashMap<Class<?>,Object>();
public static <T extends Serializable> void addToMap(Class<T> key, List<T> value) {
infoMap.put(key,value);
}
public static <T extends Serializable> List<T> getList(Class<T> key) {
return (List<T>)(infoMap.get(key));
}
关于java - 使用泛型和参数化列表的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11637244/