java - Java 中子类和集合之间的类转换异常问题

标签 java generics collections casting

所以,我有以下两个类:

Class A { }
Class B extends A { }
Class C extends A { }

还有下面的方法:

public void foo(Collection<A> bar) {
    List<A> listA = new ArrayList<>();

    for(A a : bar) {
        //a and anotherA are both of the same subtype of A
        A anotherA = getAnotherA(a);
        listA.add(anotherA);
    }

    bar.clear();
    bar.addAll(listA);
}

现在,我试图以两种不同的方式调用此方法,但我无法让转换正常工作...希望我只是忽略了一些小问题。

所以,这是我调用它的两种方式:

方式一:

A obj = ...;
Field field = //get field representing a collection of sub-type of A
Collection<A> collection = field.get(...);
foo(collection);

方式二:

B obj = ...;
Set<C> setOfC = b.getSetOfC();
foo(setOfC);

我尝试了无数次转换尝试,但我似乎无法编译它!例如,在方式 2 中,我尝试转换 setOfCSet<A> ,但我得到了一个类转换异常。我试过投 barCollection<? extends A> ,但是 bar.addAll(..) 失败了。我试图向 foo 添加一个泛型,但也出现错误。在方式 1 中,我也尝试过投 collectionCollection<? extends A> , 但还是不走运。

最佳答案

您不能传递 Set<C>进入一个期待 Collection<A> 的方法,即使是 SetCollection , 即使是 C是一个 A ,因为 Java 的泛型是不变的。

您可以在 foo 上引入类型参数方法,带有 A上限。然后你可以在整个方法中使用类型参数。这将确保 A 的相同子类型被使用。

public static <T extends A> void foo(Collection<T> bar) {
    List<T> listA = new ArrayList<>();

    for(T a : bar) {
        //a and anotherA are both of the same subtype of A
        T anotherA = getAnotherA(a);
        listA.add(anotherA);
    }

    bar.clear();
    bar.addAll(listA);
}

您的评论似乎表明 aanotherA是同一类型,所以这应该为你编译。如果不是,则 getAnotherA方法需要一些工作,以便传入 C将返回 C而不是 A .

关于java - Java 中子类和集合之间的类转换异常问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36159205/

相关文章:

android - AsyncTask 和泛型

java - 与 hibernate 的关系

java - 使用 Java API 显式提交或回滚 MQ 工作单元

java - 尝试让 java 套接字程序工作,但得到 "java.net.BindException: Address already in use 6666 "

c# 如何将泛型类型参数转换并传递给内部函数?

json - 使用 GSON 使用通用嵌套数据对象序列化响应对象

java - Java Collections Framework 中常用方法(大小)的意外复杂性?

java - 使用另一个 Map <String, List<String>> 中的选择性元素创建一个新的 Map <String, List<String>>

c# - 根据每个哈希表中的键对哈希表的 ArrayList 进行排序

java - 如何在 JUnit 测试用例中获取传递给 Runtime.getRuntime.exit(value) 的值