我对泛型有一些理解问题
我有这个变量:
private static final UnaryOperator<Object> IDENTITY_FN = t -> t;
我不明白为什么这段代码可以编译:
public static <T> UnaryOperator<T> identityFunction() {
return (UnaryOperator<T>) IDENTITY_FN;
}
UnaryOperator<String> fn = identityFunction();
但是...这段代码无法编译:
UnaryOperator<String> fn = (UnaryOperator<String>) IDENTITY_FN;
对我来说基本上是一样的
我认为在第二个代码片段中它无法编译,因为转换为 UnaryOperator 是不安全的,因此不允许编译。 IdentityFunction() 是安全的,因为它使用类型擦除,允许它使用泛型类型。由于类型擦除,强制转换 (UnaryOperator) IDENTITY_FN 是安全的。在运行时,Java 类型系统会擦除类型变量 T 并将其替换为其绑定的变量或对象(如果它是无界的)。因此在运行时,UnaryOperator 就变成了 UnaryOperator,并且 IDENTITY_FN 可以安全地转换为这种原始类型。
当您将 IdentityFunction() 的结果分配给特定类型(如 UnaryOperator)的变量时,Java 编译器会检查类型是否兼容。