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(集合栏){…}
谢谢!我想我以前试过这个方法,因为我认为这是正确的方法,但记得出错了。我又试了一次,成功了!