2016-05-22 8 views
0

Hallo Ich habe diesen Fehler:Warum kann ich die Liste <Truck> nicht als Iterable <Vehicle> verwenden?

incompatibles types: List<Car> cannot be converted to Iterable<Iterator> 

incompatibles types: List<Truck> cannot be converted to Iterable<Iterator> 

Die Klasse Car erweitert die Klasse Fahrzeug. Der Truck erweitert auch das Fahrzeug. Ich muss die Fahrzeugklasse iterierbar anlegen ??

public static void print(Iterable<Vehicle> it){ 
    for(Vehicle v: it) System.out.println(v); 
} 

public static void main(String[] args) { 
    List<Car> lcotxe = new LinkedList<Car>(); 
    List<Truck> lcamio = new LinkedList<Truck>(); 

    print(lcotxe);//ERROR 
    print(lcamio);//ERROR 


} 
+0

Sie können Generika dafür verwenden; siehe https://ideone.com/kTB71Y –

+0

ändere diesen 'print (Iterable it)' zu diesem 'print (Liste it)' –

+0

siehe auch http://stackoverflow.com/questions/933447/how-do- you-cast-a-Liste-von-Supertypen-zu-einer-Liste-von-Subtypen –

Antwort

1

Das ist nicht, weil List<Car> nicht kompiliert ist kein Subtyp von Iterable<Vehicle>.

Es ist jedoch ein Untertyp von Iterable<? extends Vehicle>. Dies nennt man covariance.

public static void print(Iterable<? extends Vehicle> it){ 
    for(Vehicle v: it) System.out.println(v); 
} 

Sie könnten auch wählen, die Methode generisch zu machen.

public static <A extends Vehicle> void print(Iterable<A> it){ 
    for(Vehicle v: it) System.out.println(v); 
} 
+0

das war neu für mich, danke @ Chris-Martin! –

Verwandte Themen