在ArrayList中使用泛型(Java,“无法应用”错误)

在ArrayList中使用泛型(Java,“无法应用”错误),java,android,list,generics,collections,Java,Android,List,Generics,Collections,在我的Android Studio项目中,我有简单的类结构: public class P{} public class A extends P{} public class B extends P{} 在另一节课上,我有一个清单: private List<? extends P> data; private List<A> listA; private List<B> listB; Android Studio中的第二行为红色,错误为: addAl

在我的Android Studio项目中,我有简单的类结构:

public class P{}

public class A extends P{}

public class B extends P{}
在另一节课上,我有一个清单:

private List<? extends P> data;
private List<A> listA;
private List<B> listB;
Android Studio中的第二行为红色,错误为:

addAll(java.util.Collection<capture<? extends com.mydomain.P>>) 
in List cannot be applied to (java.util.List<com.mydomain.subclass.B>)

addAll(java.util.Collection当您使用像
List
这样的参数化类型时,编译器会在编译时进行一些类型绑定和类型检查

所以当一个变量声明为

List<A> listA;
List<?> data;
数据的任何使用都将与类型参数
一起使用,该参数是通配符,但实际类型未知

由于它不知道实际的类型,编译器不能让您使用它。
List
add(E)
方法取决于类型变量。因此

List<A> listA = ...;
listA.add(someA);
应该用这个词,但是像这样

List<?> data = someMethod();
data.add(someA);
List data=someMethod();
数据。添加(someA);
没有。如果引用的
列表
不是用来保存
A
对象怎么办


编译器根本不允许这样做。这就是泛型类型检查的全部内容。

如果您仅使用
ArrayList
,请尝试此选项

public class P {}

public class A extends P {}

public class B extends P {}

public class MyList<T extends P> extends ArrayList<P> {
    private static final long serialVersionUID = 1L;
    ...
}

private static MyList<? extends P> data;
private static MyList<A> listA;
private static MyList<B> listB;

public static void main(String[] args) throws IOException {

    data = listA; // it's ok
    data.addAll(listB); // it's ok
}
公共类P{}
公共类A扩展了P{}
公共类B扩展了P{}
公共类MyList扩展了ArrayList

{ 私有静态最终长serialVersionUID=1L; ... }


私有静态MyList当您声明
私有列表时,编译器不能让您向列表中添加任何类型,它不知道列表的类型。基本上,如果您不知道类型,例如,您有
,您就不能使用该类型。小心,这不是同一件事。如果您有
ArrayList
,而不是
,则情况会如此。但是
 T扩展了P
。其中有什么问题。但我想知道这样的问题是什么?在他们的示例中,
addAll
方法取决于
List
中声明的类型变量
e
。编译器绑定
?在声明
List时将P
扩展到该类型变量。如果我使用它,则会给出编译错误e
ArrayList
方法addAll(Collection
List<?> data = someMethod();
data.add(someA);
public class P {}

public class A extends P {}

public class B extends P {}

public class MyList<T extends P> extends ArrayList<P> {
    private static final long serialVersionUID = 1L;
    ...
}

private static MyList<? extends P> data;
private static MyList<A> listA;
private static MyList<B> listB;

public static void main(String[] args) throws IOException {

    data = listA; // it's ok
    data.addAll(listB); // it's ok
}
private List<P> data;