List <Something>和List <有什么区别?延伸某事>?

Pur*_*ari 4 java generics

这两个有区别List吗?

List<Something> a;
List<? extends Something> b;
Run Code Online (Sandbox Code Playgroud)

我知道这个例子

List<Object> a;
List<?> b;
List c;
Run Code Online (Sandbox Code Playgroud)

List<Something> a;
List<? extends SomeInterfaceSomethingImplements> b;
Run Code Online (Sandbox Code Playgroud)

各有所不同,但这些怎么样?如果Something换成了它会有所不同Object吗?

List<Object> a;
List<? extends Object> b;
Run Code Online (Sandbox Code Playgroud)

Har*_*non 10

List<Something>是类型对象的列表Something. List<? extends Something>是一个扩展的特定类型的对象列表Something.

因此,List<Object>可以包含任何扩展的类的对象Object.但是List<? extends Object>只能初始化或指定为扩展的特定类的对象的ListObject

什么时候有用?假设你要编写需要一个方法ListObjects并打印每个项目:

void print(List<Object> list) {
    for (Object obj: list) {
        System.out.println(obj)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们说你有一个List<Integer>.你不能将它传递给上面的方法,因为printtake List<Object>,并且List<Integer>不能分配给a List<Object>.为了解决这个问题,我们重新定义print为:

void print2(List<? extends Object> list) {
    for (Object obj: list) {
        System.out.println(obj)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我们可以将Object的任何子类的List传递给print2.print2会接受List<Integer>,List<String>等等.

另一方面,您无法在列表中添加任何内容print2,因为print2不知道使用的具体子类型Object.因此,您? extends ...只能在不必添加任何内容的方法中使用List.