下面的代码包含对Enum::name
(注意没有类型参数)的引用。
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 编译时报警告:
[警告] 找到原始类型:java.lang.Enum 缺少泛型类 java.lang.Enum 的类型参数
将表达式更改为Enum<T>::name
会导致警告消失。
然而,IdeaEnum<T>::name
用以下警告标记版本:
可以推断出显式类型参数
反过来,Eclipse (ECJ) 没有报告任何一种配方的任何问题。
三种方法哪一种是正确的?
一方面,原始类型相当讨厌。如果您尝试放置一些其他类型的参数,例如 Enum<Clause>::name
将导致编译失败,那么这是一些额外的保护。
另一方面,上面的引用等同于e -> e.name()
lambda,并且这个公式不需要类型参数。
环境:
- Java 8u91
- IDEA 15.0.3 社区
- 欧洲法院 4.5.2