【发布时间】:2013-02-25 16:41:00
【问题描述】:
考虑在Effective 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。但恒等函数很特殊:它 返回未修改的参数,因此我们知道使用它是类型安全的 无论T的值如何,它都是UnaryFunction<T>。因此,我们可以 自信地抑制由生成的未经检查的强制转换警告 这个演员表。完成此操作后,代码编译不会出错或 警告。
【问题讨论】:
-
附带问题:您在使用什么书,它是否说明了这段代码的意义?
-
@Jeff Effective java 是书名,它在泛型章节中,特别是在描述泛型函数的部分。
标签: java generics effective-java