What is the difference between List <Something> and List <? extends something>?

Is there any difference between these two Lists?

List<Something> a;
List<? extends Something> b;

I know, for example,

List<Object> a;
List<?> b;
List c;

and

List<Something> a;
List<? extends SomeInterfaceSomethingImplements> b;

all different, but what about these? And another, if it Somethingwas replaced by Object?

List<Object> a;
List<? extends Object> b;
+4
source share
4 answers

List<Something>is a list of type objects Something. List<? extends Something>- This is a list of objects of a certain type that extends Something.

So, it List<Object>can have objects of any class that extends Object. But it List<? extends Object>can only be initialized or assigned as a list of objects of a certain class that extendsObject

? , , List Objects :

void print(List<Object> list) {
    for (Object obj: list) {
        System.out.println(obj)
    }
}

, List<Integer>. , print List<Object>, List<Integer> List<Object>. , print :

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

List Object print2. print2 List<Integer>, List<String> ..

- print2, print2 Object, . , ? extends ... , List.

+8

, List<Something> - Something, List<? extends Something> , Something.

List<Object> Object.

List<? extends Object> , Object.

, Object ? extends Object:

import java.util.ArrayList;

public class test {
    class A {}

    public static void main(String[] args) {
        // No error
        ArrayList<Object> arrObj = new ArrayList<Object>();

        // Error
        ArrayList<Object> arrObj2 = new ArrayList<A>();

        // No Error
        ArrayList<? extends Object> arrExt = new ArrayList<Object>();

        // No Error
        ArrayList<? extends Object> arrExt2 = new ArrayList<A>();
    }

}
+2

List<Something> , - ArrayList<Something>. List<? extends Something> , - ArrayList<Something> ArrayList<SomethingChild>, SomethingChild extends Something.

List<? extends Something> list = new ArrayList<SomethingChild>();

List<Something> list = new ArrayList<SomethingChild>();

.

You can learn more about Generics and wildcards used in Generics to gain insight.

+1
source

The first is a set of object types, and the second is a collection of objects that are a subtype of something.

0
source

All Articles