java - 使用泛型和参数化列表的问题

标签 java list generics casting parameterized

我创建了以下测试类:

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/

相关文章:

python - 如果标题中的所有单词 : match

c# - 转换为 IList 然后在 null 时调用 ToList() 是否比普通 ToList() 更好?

r - 将不同长度的字符向量列表放入数据框中

java - 通用 N 元树(每个子节点有两个以上节点的树)Java 中使用列表遍历节点的树

java - 为什么当我输入 3 个相同的数字时,我的输出总是相同?

java - 启动 Activity 不会继续到下一个 Activity/类(class) - android studio

java - 我的第一个游戏 : Python using pygame vs. Java 使用 lwjgl?

java - Java 中的 Thread.yield() 和 Thread.sleep(0) 有什么区别?

java - 创建通用 GWT 事件 : is this a good approach?

java - 如何创建 <?用 JCodeModel 扩展子类型>?