Ich habe eine MWE erstellt, wo das Ändern einer einzelnen Zeile durch Hinzufügen von <?>
einen Compilerfehler löst.Entfällt <?> bricht diesen Code unbrauchbar
Der folgende Code lässt sich nicht kompilieren:
import java.util.List;
public class MainClass {
public void traverse() {
List<MyEntity> list = null /* ... */;
for (MyEntity myEntity : list) {
for (String label : myEntity.getLabels()) { // <-- Offending Line
/* ... */
}
}
}
interface MyEntity<T> {
T get();
List<String> getLabels();
}
}
Der Compiler Fehler ist:
Error:(9, 51) java: incompatible types: java.lang.Object cannot be converted to java.lang.String
die Definition in der Codezeile von MyEntity myEntity
zu MyEntity<?> myEntity
Ändern löst das Problem. Ich frage mich, warum ist der Rückgabetyp dieser für jede als Object
behandelt und nicht als String
, es sei denn, ich füge den Platzhalter der übergeordneten Klasse hinzu? Beachten Sie, dass getLabels()
selbst keine Generika enthält.
Gemäß Chapter 14.14.2. of the Java Language Specification wird ein for-each mithilfe eines Iterators in eine Schleife kompiliert. Interessanterweise erweitert die for-each so Iterator manuell Werke:
Iterator<String> iterator = myEntity.getLabels().iterator();
while (iterator.hasNext()) {
String label = iterator.next();
/* ... */
}
Kann mir jemand erklären, warum?
Nice one, noch nie gesehen, dass vor – Andremoniy