Referências de métodos para tipos brutos prejudiciais?
O código abaixo contém uma referência paraEnum::name
(observe nenhum parâmetro de tipo).
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 relata um aviso durante a compilação:
[WARNING] encontrado tipo bruto: java.lang.Enum argumentos de tipo ausentes para a classe genérica java.lang.Enum
Alterando a expressão paraEnum<T>::name
faz com que o aviso desapareça.
No entanto, a Idea sinaliza oEnum<T>::name
versão com um aviso de que:
Argumentos de tipo explícito podem ser inferidos
Por sua vez, o Eclipse (ECJ) não relata nenhum problema com qualquer formulação.
Qual das três abordagens está correta?
Por um lado, os tipos brutos são bastante desagradáveis. Se você tentar colocar outro argumento de tipo, por exemplo,Enum<Clause>::name
fará com que a compilação falhe, por isso é uma proteção extra.
Por outro lado, a referência acima é equivalente ae -> e.name()
lambda, e essa formulação não requer argumentos de tipo.
Ambiente:
Java 8u91Comunidade IDEA 15.0.3TJCE 4.5.2