为什么禁止这种未经检查的警告是安全的?

Gee*_*eek 7 java generics effective-java

考虑Effective Java泛型章节中UnaryFunction定义的接口.

public interface UnaryFunction<T> {
T apply(T arg);
}
Run Code Online (Sandbox Code Playgroud)

和以下代码返回 UnaryFunction

// Generic singleton factory pattern
private static UnaryFunction<Object> IDENTITY_FUNCTION = new UnaryFunction<Object>() {
  public Object apply(Object arg) { return arg; }
};

// IDENTITY_FUNCTION is stateless and its type parameter is
// unbounded so it's safe to share one instance across all types.
@SuppressWarnings("unchecked")
public static <T> UnaryFunction<T> identityFunction() {
  return (UnaryFunction<T>) IDENTITY_FUNCTION;
}
Run Code Online (Sandbox Code Playgroud)

为什么演员IDENTITY_FUNCTION(UnaryFunction<T>)安全?

这本书说的是我要问的问题,但我不能遵循这里的逻辑.我们在哪里调用apply执行身份操作的函数?我很困惑,因为它是返回传递给它的同一个对象而不修改任何东西的函数.

IDENTITY_FUNCTION (UnaryFunction<T>)的强制转换生成一个未经检查的强制转换警告,因为UnaryFunction<Object>它不适 UnaryFunction<T>用于每个人T.但是身份函数是特殊的:它返回其参数未经修改,因此我们知道将其用作UnaryFunction<T>任何值的类型都是安全的T.因此,我们可以放心地抑制由此强制转换生成的未经检查的强制转换警告.完成此操作后,代码将编译而不会出现错误或警告.

Per*_*ion 3

仅当恒等函数返回准确的值时,强制转换才是安全的最初传递给它的因此,在运行时,不存在T可能违反强制转换的泛型参数的特殊化。

也就是说,您正在将一个对象转换为它自己的类型。