2017-03-23 3 views
-1

Ich schrieb ein kleines Stück Code für Sammlungen mit Generics und der Code ist wie unten.Learning Java Generics

Kann jemand erklären, was mit diesem Code falsch ist. Weil es folgenden Fehler wirft.

error: unexpected type                           
    List<?> list1 = new ArrayList<?>();                            
           ^                            
    required: class or interface without bounds                          
    found: ?                                  
HelloWorld.java:11: error: no suitable method found for add(String)                     
    list1.add("Zahid");                                
     ^                                  
    method Collection.add(CAP#1) is not applicable                         
     (argument mismatch; String cannot be converted to CAP#1)                      
    method List.add(CAP#1) is not applicable                          
     (argument mismatch; String cannot be converted to CAP#1)                      
    where CAP#1 is a fresh type-variable:                            
    CAP#1 extends Object from capture of ?                           
HelloWorld.java:12: error: no suitable method found for add(int)                     
    list1.add(22);                                 
     ^                                  
    method Collection.add(CAP#1) is not applicable                         
     (argument mismatch; int cannot be converted to CAP#1)                       
    method List.add(CAP#1) is not applicable                          
     (argument mismatch; int cannot be converted to CAP#1)                       
    where CAP#1 is a fresh type-variable:                            
    CAP#1 extends Object from capture of ?                           
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output               
3 errors 
+0

Sie den generischen Typen ('Liste ') oder "erlauben" alle Typen mit 'Liste angeben sollen '. Aber die zweite Version hat keinen Vorteil, also sollten Sie die erste bevorzugen. –

+0

@PJvG Er kompilieren kann 'Liste list1 = new Arraylist ();' erfolgreich, aber als Slimu antwortete nur 'null' auf eine Liste mit unbeschränktem Wildcard Typ hinzufügen kann. –

+0

@StefanWarminski richtig, ich formulierte es falsch, ich meinte er nicht tun kann 'Liste list1 = new Arraylist ();' gefolgt von 'list1.add ("Zahid");'. Ich werde meinen Kommentar löschen, weil Slimus Antwort ausreichend ist, um das Problem zu erklären. – PJvG

Antwort

1

Sie verwenden eine generische Auflistung mit einem ungebundenen Platzhalter. Dies bedeutet, dass Sie nur über diese Sammlung iterieren können und der einzige Wert, den Sie hinzufügen können, ist null.

dieses Tutorial Sehen Sie, wenn Sie mehr erfahren möchten: https://docs.oracle.com/javase/tutorial/java/generics/

0

wenn Sie

da sagen

new Arraylist <>();

im Grunde, was Sie versuchen, eine Arraylist zu tun ist, instanziiert.

[?] Von Typ Jokerzeichen. WildCard [?] bedeutet einen bestimmten, noch unbekannten Typ. Da dieser Typ nicht zur Kompilierzeit bekannt ist, dürfen Sie die Liste nicht ändern.

wenn Sie die Implementierung von Arraylist in java.util sehen gibt es Generics in der Arraylist, die eine Art erwarten.

Also, wenn Sie verwenden Platzhalter „?“ Der Compiler hat keine Ahnung, welche Art von ArrayList instanziiert werden soll. Es wird einen Kompilierzeit Fehler "Kann den Typ ArrayList nicht instanziieren"

so, wenn Sie etwas hinzufügen. Es ist wahrscheinlicher, dass Sie aufgefordert werden, der Liste null hinzuzufügen.

Um mehr über wildCards wissen: [https://stackoverflow.com/a/12341269/7756013]