Blick in einer anderen question ich in dieses faszinierende Verhalten der 1.8.0_112 Sun-Oracle-Compiler gestoßen (ich habe mit anderen nicht getestet):Warum beeinflusst die Verwendung von Rohtypvariablen Signaturen ohne Bezug auf Typparameter?
import java.util.List;
interface Alpha<T> {
List<Integer> intList();
}
interface Beta {
List<Integer> intList();
}
class Main {
public static void main(String[] args) {
Alpha rawAlpha = null;
Alpha<Character> charAlpha = null;
Alpha<?> qmAlpha = null;
Beta beta = null;
for (Integer i : charAlpha.intList()) {}
for (Integer i : qmAlpha.intList()) {}
for (Integer i : beta.intList()) {}
for (Integer i : rawAlpha.intList()) {}
}
}
Der Compiler nur for-Schleife in dem letzten fehlschlägt:
error: incompatible types: Object cannot be converted to Integer
for (Integer i : rawAlpha.intList()) {}
^
1 error
Also trotz dieser intList()
Rückgabeliste Typ List<Integer>
in Alpha
hängt nicht von der Art Parameter T
, so scheint es, dass die <Integer>
Epochen Ed zur Kompilierzeit.
Beachten Sie, dass, wenn wir eine nicht-generische Schnittstelle Beta
deklarieren, die theoretisch gleichbedeutend mit der Bezugnahme auf die rohe Alpha
wäre, gibt es keine Probleme.
Ist dies das erwartete Verhalten? Kann jemand auf den Absatz über die Sprachspezifikation hinweisen, der diesen Punkt abdecken würde? Wenn dies kein Fehler ist, erscheint es zumindest anti-intuitiv und nicht-produktiv; vielleicht ist es der Vergleichbarkeit halber getan?
Wenn ein generischer Typ als roher Typ verwendet wird, verliert er alle seine Generika, nicht nur die, die von dem Typ abhängen, den Sie nicht angegeben haben. –
@PeterLawrey Ja, das scheint der Fall zu sein, aber die Frage ist warum? –
Ich fragte einen der Entwickler zu dem Zeitpunkt, als Java 5.0 veröffentlicht wurde. Es schien mir, dass es nicht viele Ressourcen gab, um andere Fälle zu unterscheiden, entweder ein roher Typ für Rückwärtskompatibilität oder ein generischer. Es gibt keinen etwas rauhen, aber dennoch gesunden Rückfall. –