考虑在有效的Java 泛型一章中定义的UnaryFunction接口。

public interface UnaryFunction<T> {
T apply(T arg);
}

以及以下用于返回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;
}

为什么将IDENTITY_FUNCTION转换为(UnaryFunction<T>)是安全的?

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

将IDENTITY_FUNCTION强制转换为(UnaryFunction<T>)会生成一个
未经检查的强制转换警告,因为UnaryFunction<Object>不是
每个UnaryFunction<T>T。但是身份功能很特殊:它
返回其参数未修改,因此我们知道使用它是类型安全的
无论UnaryFunction<T>的值如何,都将其作为T。因此,我们可以
放心地抑制由生成的未经检查的强制转换警告
这个演员。完成此操作后,代码将正确编译,不会
警告。

最佳答案

仅当identity函数返回首先传递给它的精确对象时,转换才是安全的。因此,在运行时,没有通用参数T的特殊化会违反强制转换。

又就是,您正在将对象转换为自己的类型。

07-26 02:59