Methodenverweise auf schädliche Rohtypen?
Der folgende Code enthält einen Verweis aufEnum::name
(Beachten Sie keinen Typparameter).
public static <T extends Enum<T>> ColumnType<T, String> enumColumn(Class<T> klazz) {
return simpleColumn((row, label) -> valueOf(klazz, row.getString(label)), Enum::name);
}
public static <T, R> ColumnType<T, R> simpleColumn(BiFunction<JsonObject, String, T> readFromJson,
Function<T, R> writeToDb) {
// ...
}
Javac meldet eine Warnung während des Kompilierens:
[WARNUNG] Rohtyp gefunden: java.lang.Enum fehlende Typargumente für die generische Klasse java.lang.Enum
Ändern Sie den Ausdruck inEnum<T>::name
bewirkt, dass die Warnung verschwindet.
Allerdings kennzeichnet Idea dasEnum<T>::name
Version mit einer Warnung, dass:
Explizite Typargumente können abgeleitet werden
Eclipse (EuGH) meldet wiederum keine Probleme mit beiden Formulierungen.
Welche der drei Ansätze ist richtig?
inerseits sind Rohtypen ziemlich böse. Wenn Sie versuchen, ein anderes Typargument zu verwenden, z.Enum<Clause>::name
führt dazu, dass die Kompilierung fehlschlägt und bietet zusätzlichen Schutz.
uf der anderen Seite ist der obige Verweis äquivalent zue -> e.name()
Lambda, und für diese Formulierung sind keine Typargumente erforderlich.
Enviorment:
Java 8u91IDEA 15.0.3 CommunityECJ 4.5.2