考虑在Effective Java generics 一章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>
for eachT
。但是标识函数很特殊:它返回未修改的参数,因此我们知道将其用作类型安全UnaryFunction<T>
的值是T
. 因此,我们可以放心地抑制此强制转换生成的未经检查的强制转换警告。完成此操作后,代码编译时不会出现错误或警告。