gpt4 book ai didi

java - 如何推断泛型类型以避免未经检查的转换

转载 作者:行者123 更新时间:2023-11-29 02:59:29 25 4
gpt4 key购买 nike

假设我们有一个类 A,它有两个子类 A1、A2。假设我们有另一个类 B,它也有两个子类,B1 和 B2:

class B{
List<? extends A> myGenericList;

B(List<? extends A> myGenericList){
this.myGenericList = myGenericList;
}

public List<? extends A> getMyGenericList(){
return myGenericList;
}
}

class B1 extends B{
B1(List<A1> a1List){
super(a1List);
}
}

class B2 extends B{
B2(List<A2> a2List){
super(a2List);
}
}

现在,如果我们有一个像这样的 C1 类:

class C1{
...

public void doSomethingWithB1(B1 b1){
List<A1> a1list = (List<A1>)b1.getMyGenericList();
}

...
}

如何实现类 B 的 getMyGenericList 才能避免未检查的转换警告?

我试过这样的:

public <T extends A> List<T> getMyGenericList() {
return this.myGenericList;
}

但是编译器提示 cannot convert from List<capture#3-of ? extends A> to List<T>

有什么办法吗?

提前致谢。

最佳答案

用当前的方式你已经定义了 B类,myGenericList实例变量可以包含 A 的任何子类型的列表,因此在转换为 List<A1> 时会收到未经检查的转换警告是有道理的。它可能是 List<A>List<A2> .

如果你真的不关心哪个A你回到列表中,你可以将它分配给 List<? extends A> .

List<? extends A> a1list =  b1.getMyGenericList();

但是如果你真的想要一个List<A1>B1 返回,然后是 B 上的泛型类是你的答案。定义 T在类别级别,上限为 A .在类里面使用它来替换通配符。

class B<T extends A>
{
List<T> myGenericList;

B(List<T> myGenericList){
this.myGenericList = myGenericList;
}

public List<T> getMyGenericList(){
return myGenericList;
}
}

B 的子类将定义什么 T分别是。

class B1 extends B<A1>  // rest of class is the same

class B2 extends B<A2> // rest of class is the same

这样您就消除了未经检查的强制转换警告,甚至根本不需要强制转换。

List<A1> a1list = b1.getMyGenericList();

关于java - 如何推断泛型类型以避免未经检查的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35921602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com