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

Java中子类和集合之间的类强制转换异常问题,java,generics,collections,casting,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

因此,我有以下两个课程:

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);
}
public void foo(集合栏){
List listA=new ArrayList();
对于(A:bar){
//a和另一个a都是a的同一亚型
A另一个=另一个(A);
添加(另一个);
}
bar.clear();
bar.addAll(listA);
}
现在,我试着用两种不同的方法来调用这个方法,但是我不能让这个方法正常工作。。。希望我只是忽略了一些小东西

因此,我有两种说法:

方式1:

A obj = ...;
Field field = //get field representing a collection of sub-type of A
Collection<A> collection = field.get(...);
foo(collection);
A obj=。。。;
Field=//获取表示
Collection=field.get(…);
foo(收集);;
方式2:

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

我尝试过无数次施法尝试,但我似乎无法编译它!例如,在方法2中,我尝试将
setOfC
强制转换为
Set
,但我得到了一个类强制转换异常。我曾尝试将
条形图
转换为
集合您无法将
传递给一个需要
集合
的方法,即使
集合
,即使
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);
}
publicstaticvoidfoo(集合栏){
List listA=new ArrayList();
适用于(TA:bar){
//a和另一个a都是a的同一亚型
T anotherA=getAnotherA(a);
添加(另一个);
}
bar.clear();
bar.addAll(listA);
}

您的评论似乎表明
a
anotherA
属于同一类型,因此这应该为您编译。如果不是,则
getAnotherA
方法将需要一些工作,以便传入
C
将返回
C
,而不是
a
,如果您有以下类:

Class YourA { }
Class YourB extends YourA { }
Class YourC extends YourA { }
您的方法的签名最像

public <G extends YourA> void foo(Collection<G> bar) {...}
publicsvoidfoo(集合栏){…}

谢谢!我想我以前试过这个方法,因为我认为这是正确的方法,但记得出错了。我又试了一次,成功了!