2017-03-14 4 views
0

Ich habe eine Methode mit List als Parameter.List Cast Fehler bei Verwendung Schnittstelle

private static void setData(List<IData> list) { 

} 

Die interface IData ist

public interface IData { 
    int getData(); 
} 

Und ich habe eine Klasse Data benannt, die implements die Schnittstelle von IData

public class Data implements IData{ 

    @Override 
    public int getData() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

} 

Die Frage ist, wenn ich die Parameter der Liste verwenden Methode aufrufen , es kann nicht kompiliert werden.

public class Test { 
    public static void main(String[] args) { 
     List<Data> temp = new ArrayList<>(); 
     for (int i = 0; i < 5; i++) { 
      temp.add(new Data()); 
     } 
     setData(temp); 

     List<IData> temp2 = new ArrayList<>(); 
     for (int i = 0; i < 5; i++) { 
      temp2.add(new Data()); 
     } 
     setData(temp2); 
    } 

    private static void setData(List<IData> list) { 

    } 
} 

setData(temp) ist Fehler. setData(temp2) ist in Ordnung. Beide Listen haben denselben Inhalt. Ich verstehe nicht.

+1

Verwenden Sie eine [obere Grenze] (https://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html), dh 'setData (Liste Liste)' – TNT

+0

Sie könnten verwenden 'private static void setData (List list) {', aber dies könnte Auswirkungen auf Ihre Implementierung haben, persönlich würde ich nur 'List ' in 'List ' – MadProgrammer

+0

ändern Obere Grenzen sind für Menschen am nützlichsten Wer hat die notwendige Grundlage in Generika, Vererbung und Subtyping erhalten. Selbst mit dieser Grundlage sind sie subtile Bestien. –

Antwort

1

Sie können nur Subtypen von Parametern in als Argumente, weil Subtypen die ist-ein Verhältnis: auch eine Instanz eines Subtyps ist-eine Instanz des übergeordneten Typs. Es spielt keine Rolle mit Ihren Listen, was der Inhalt ist, nur was die Listentypen sind, relativ zum erwarteten Parametertyp. Ihre Methode setData(List<IData> list) erfordert ein Argument is-aList<IData>, aber Sie haben versucht, es eine List<Data> übergeben, die kein Untertyp List<IData> ist. Daher konnte der Compiler den Code nicht akzeptieren.

Generics, Vererbung und Subtypen sind das Thema des Java-Lernprogramms mit dem Titel "Generics, Inheritance, and Subtypen", das ich Ihnen als gute Einführung in das Thema lobe. Tieferes Wissen wird durch Einsichtnahme in Angelika Langers ausgezeichnete Website zu Generika gewonnen, die ich Ihnen ebenfalls zur Kenntnis nehme.

Verwandte Themen