Java:转换和泛型

问题描述 投票:0回答:1

我对泛型有一些理解问题

我有这个变量:

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;

对我来说基本上是一样的

java generics casting
1个回答
0
投票

我认为在第二个代码片段中它无法编译,因为转换为 UnaryOperator 是不安全的,因此不允许编译。 IdentityFunction() 是安全的,因为它使用类型擦除,允许它使用泛型类型。由于类型擦除,强制转换 (UnaryOperator) IDENTITY_FN 是安全的。在运行时,Java 类型系统会擦除类型变量 T 并将其替换为其绑定的变量或对象(如果它是无界的)。因此在运行时,UnaryOperator 就变成了 UnaryOperator,并且 IDENTITY_FN 可以安全地转换为这种原始类型。

当您将 IdentityFunction() 的结果分配给特定类型(如 UnaryOperator)的变量时,Java 编译器会检查类型是否兼容。

© www.soinside.com 2019 - 2024. All rights reserved.