class GenericCompilationFailureDemo {
List<? extends GenericCompilationFailureDemo> newList() {
return new ArrayList<GenericCompilationFailureDemo>();
};
void useList() {
List<GenericCompilationFailureDemo> list =
(List<GenericCompilationFailureDemo>) newList();
}
List<? extends Set<GenericCompilationFailureDemo>> newListOfSpecificSets() {
return new ArrayList<Set<GenericCompilationFailureDemo>>();
};
void useListOfSpecificSets() {
List<Set<GenericCompilationFailureDemo>> listOfSpecificSets =
(List<Set<GenericCompilationFailureDemo>>) newListOfSpecificSets();
}
List<? extends Set<? extends GenericCompilationFailureDemo>> newListOfSets() {
return new ArrayList<Set<? extends GenericCompilationFailureDemo>>();
};
void useListOfSet() {
List<Set<? extends GenericCompilationFailureDemo>> listOfSets =
(List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets();
}
}
kompiluje pod Sun JDK 1.6.0_20 (64-bit Windows Vista, ale nie sądzę, że czyni żadnej różnicy), ale powoduje następujące niepowodzenie kompilacji pod Oracle JDK 1.7.0_01 (ta sama platforma):
[ERROR] src\main\java\GenericCompilationFailureDemo.java:[56,78] error: inconvertible types
Zauważ, że pierwszy dwa „rozciąga się do określonego typu” rzuca w useList
i useListOfSpecificSets
zarówno pod 1.7.0_01 jeszcze odnieść sukces, więc wydaje się, że to ma coś wspólnego z "podwójny rodzajowy się rozszerza".
Jakieś pomysły, które mogły się zmienić między 6 a 7, i czy zaobserwowane zachowanie jest zgodne ze specyfikacją lub błędem?
edytowane w odpowiedzi na komentarz Sanjay za:
@Sanjay: Aha, ciekawe! Tutaj wyjście z java -version
:
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
I tu wynikiem javac GenericCompilationFailureDemo.java
(ten sam kod jak wyżej z wypowiedzi na przywóz List, ArrayList set):
GenericCompilationFailureDemo.java:30: error: inconvertible types
(List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets()
;
^
required: List<Set<? extends GenericCompilationFailureDemo>>
found: List<CAP#1>
where CAP#1 is a fresh type-variable:
CAP#1 extends Set<? extends GenericCompilationFailureDemo> from capture of ?
extends Set<? extends GenericCompilationFailureDemo>
Note: GenericCompilationFailureDemo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
Na co warto, to kompiluje kod na moim JDK 7. Można zaksięgować całą moc 'java -version' polecenia wraz z„Build " strunowy? –
proszę wkleić dokładne błędy kompilacji + sugestie sanjaya. * Wierzę, że generics mają być nieco prostsze w java 7 * w niektórych przypadkach ... może znalazłeś przypadek rogu, gdzie starsza, złożona, składnia JDK 6 łamie nowy kompilator. – jayunit100
@Sanjay: aha, ciekawe! Zobacz edytowane pytanie odpowiedzi na komentarze –