invokeAll () akzeptiert kein CollectionCallableT

8

Ich verstehe nicht, warum dieser Code nicht kompiliert wird

%Vor%

Der Fehler msg ist:

%Vor%

list ist ein Collection von DocFeeder , das Callable<Boolean> implementiert - Was ist los?!

    
Yossale 16.12.2008, 08:33
quelle

4 Antworten

18

Nur um sauas Antwort etwas zu erweitern ...

In Java 5 wurde die Methode wie folgt deklariert:

%Vor%

In Java 6 wird die Methode wie folgt deklariert:

%Vor%

Der Platzhalterunterschied ist sehr wichtig - denn List<DocFeeder> ist ein Collection<? extends Callable<T>> , aber es ist nicht a Collection<Callable<T>> . Überlegen Sie, was mit dieser Methode passieren würde:

%Vor%

Das ist legal - aber es ist eindeutig schlecht, wenn Sie addSomething mit einem List<DocFeeder> aufrufen können, da versucht wird, einen Nicht-DocFeeder zur Liste hinzuzufügen.

Wenn Sie also mit Java 5 festgefahren sind, müssen Sie List<Callable<Boolean>> von Ihrem List<DocFeeder> erstellen.

    
Jon Skeet 16.12.2008, 08:55
quelle
7

Dieser Code kompiliert perfekt mit Java 6, aber kompiliert nicht mit Java 5

%Vor%

Allerdings ändert sich die list folgendermaßen:

%Vor%

Funktioniert auf Java 5 und Java 6.

    
Joachim Sauer 16.12.2008 08:42
quelle
0

Danke für die ausführliche Antwort, aber es stört mich immer noch - Callable ist eine Schnittstelle, also eigentlich sollte die "addSomething" -Funktion in Jons Antwort in Ordnung sein (nicht nur legal, sondern vernünftig) - denn, nun, das ist das Ganze Point of Interfaces - Solange Sie eine erste Übereinstimmung einhalten, ist mir egal, welches Objekt Sie der Liste hinzufügen würden. Imo, das Problem, das Sie vorgestellt haben, sollte in einem anderen Bereich behandelt werden.

Abgesehen davon bleibt die Tatsache bestehen, dass der Code nicht kompiliert wurde - und er sollte ...

haben     
Yossale 16.12.2008 09:03
quelle
0
%Vor%     
ssssss 16.04.2009 03:56
quelle

Tags und Links