2016-06-14 6 views
0
import java.util.*;  

class Test 
{ 
    public static class Base 
    {   
    } 

    public static class Derived1 
     extends Base 
    {    
    } 

    public static class Derived2 
     extends Base 
    {    
    } 

    public static void main (String[] args) 
    { 
     //Example1. 
     List<? extends Base> e = new ArrayList<Base>(); 
     e.add(new Derived1()); //this won't compile 

     //Example2. 
     List<? super Base> b = new ArrayList<Base>(); 
     b.add(new Derived1()); //this compiles 
    } 
} 

Antwort

3

List<? super Base> b kann entweder ein List<Base> oder ein List<Object> zugeordnet werden. Eine Derived1 Instanz kann zu beiden hinzugefügt werden, sodass die b.add(new Derived1()) Anweisung die Kompilierung übergibt.

Auf der anderen Seite kann List<? extends Base> e eine List<Derived2> zugewiesen werden, so dass der Compiler keine Derived1 Instanz hinzufügen kann.

+0

Vielen Dank. Das hat geholfen! :) – Willmore

1

Siehe What is PECS (Producer Extends Consumer Super)?.

Wenn Sie etwas zu einem List<T> hinzufügen, dann ist die Liste ein Verbraucher der Sache, die Sie hinzufügen. Daher muss der Typ der Listenelemente T der gleiche sein wie der, den Sie hinzufügen möchten oder ein Supertyp.

+0

ty. für diese Antwort :) – Willmore