2016-07-13 13 views
-1
public class HelloWorld{ 

public static void main(String[] args) { 

    List<? extends Number> callback = new ArrayList<Long>(); 
    new Container<>().test(callback); 
} 

public static class Container<T extends Number> { 

    public void test(List<T> some) { 

    } 

} 

}Generics - inkompatible Typen

dieser Code erzeugt

HelloWorld.java:7: error: incompatible types: List<CAP#1> cannot be converted to List<Number>                                       
     new Container<>().test(callback);                                                    
          ^                                                      
    where CAP#1 is a fresh type-variable:                                                     
    CAP#1 extends Number from capture of ? extends Number 

Können Sie in Details dieser Code falsch erklären.

Ich gehe davon aus, dass neue Container wird mit Typ mit Rückruf Zum einen

+3

Etwas sinnlos, da 'String' eine' final' Klasse ist. – Bohemian

+1

@Bohemian Stellen Sie sich vor, dass es die Nummer ist – gstackoverflow

+0

Verwenden Sie in diesem Fall 'Number', da es berechtigte Gründe gibt,' Zahl' in Generika, aber nicht sehr viele für 'String' zu verwenden. – Makoto

Antwort

1

kompatibel verallgemeinert werden, kann es keine Art sein, die String als String erstreckt sich eine letzte Klasse ist.

Zweitens kann der Compiler nicht feststellen, ob der Typ ? extends SomeType, die Sie für Ihre List verwenden den gleichen Typ wie T extends SomeType ist, die Sie für die Container Klasse zu verwenden, so wird ein Fehler ausgegeben.

Was würden Sie tun müssen, ist entweder eine generische Art in der Methodensignatur deklarieren, und verwenden Sie diese Art sowohl für die List und Container:

public <T extends SomeClass> void example() { 
    List<T> callback = new ArrayList<>(); 
    new Container<T>().test(callback); 
} 

oder die Liste mit einem nicht begrenzt Typ deklarieren:

List<SomeClass> callback = new ArrayList<>(); 
new Container<>().test(callback); 
+0

yeah, es ist wahr +1 –

+0

Ich denke du meintest * deklariere die Liste mit einem nicht-beschränkten Typ *, nein? – Bohemian

+0

@Bohemian ja, mein schlechtes – explv

0

Nun, Sie verwenden Generika. Wenn Sie Container definieren, wird dem Container-Standardkonstruktor mitgeteilt, dass er einen Typ unterstützen muss, bei dem es sich um eine Instanz von String handelt. Hier ist ein korrektes Beispiel welches String SubClass von Object ist, also benutze ich das.

public class HelloWorld{ 

    public static void main(String[] args) { 

     List<String> callback = new ArrayList<String>(); 
     new Container<String>().test(callback); 
    } 

    public static class Container<T extends Object> { 

     public void test(List<T> some) { 

     } 

    } 
} 

Ich hoffe, das hilft Ihnen.