Java 如何推断泛型类型以避免未经检查的强制转换
假设我们有一个类a,它有两个子类A1,A2。 假设我们有另一个类B,它也有两个子类B1和B2:Java 如何推断泛型类型以避免未经检查的强制转换,java,generics,Java,Generics,假设我们有一个类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(){ retur
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);
}
}
B类{
List按照您定义B
类的当前方式,mygenericslist
实例变量可以包含a的任何子类型的列表,因此当您对List
进行强制转换时得到的未选中强制转换警告是正确的。它可以是List
或List
如果您不关心列表中的A
是哪一个,您可以使用您定义B
类的当前方式将其分配给list,那么mygenericslist
实例变量可以保存A的任何子类型的列表,因此在对list
进行强制转换时得到的未选中强制转换警告是合理的d、 它可以是列表
或列表
如果您不关心列表中返回的是哪个A
,您可以将其分配给列表,您应该将通用定义移动到类级别,如下所示:
class B<T extends A> {
List<T> myGenericList;
B(List<T> myGenericList){
this.myGenericList = myGenericList;
}
public List<T> getMyGenericList(){
return myGenericList;
}
}
您应该将泛型定义移动到类级别,如下所示:
class B<T extends A> {
List<T> myGenericList;
B(List<T> myGenericList){
this.myGenericList = myGenericList;
}
public List<T> getMyGenericList(){
return myGenericList;
}
}
List@RahulSharma请注意,您不能使用该习惯用法将元素添加到列表中,也不能将类B设置为泛型:class B{list myGenericList;}
;class B1扩展了B
List@RahulSharma请注意,您不能使用该习惯用法将元素添加到列表中,也不能将类B设置为泛型:class B{List myGenericList;}
;B1班扩展B
感谢@AlexR和rgetman的回答。我今天会测试他们谢谢@AlexR和rgetman的回答。我今天会测试他们
List<? extends A> a1list = b1.getMyGenericList();
class B<T extends A>
{
List<T> myGenericList;
B(List<T> myGenericList){
this.myGenericList = myGenericList;
}
public List<T> getMyGenericList(){
return myGenericList;
}
}
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();
class B<T extends A> {
List<T> myGenericList;
B(List<T> myGenericList){
this.myGenericList = myGenericList;
}
public List<T> getMyGenericList(){
return myGenericList;
}
}
class B1 extends B<A1>{
B1(List<A1> a1List){
super(a1List);
}
}