考虑在有效的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
的特殊化会违反强制转换。
又就是,您正在将对象转换为自己的类型。