Java 如何推断泛型类型以避免未经检查的强制转换

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

假设我们有一个类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);
  }
}
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);
  }
}