有効な 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
ID 操作を行う関数はどこで呼び出しているのでしょうか。何も変更せずに渡された同じオブジェクトを返すのはその関数であるため、私は混乱しています。
IDENTITY_FUNCTION のキャストは、 for everyではない ため
(UnaryFunction<T>)
、チェックされていないキャスト警告を生成します。しかし恒等関数は特別です: 引数を変更せずに返すので、 の値が何であれ、それを として使用しても型安全であることがわかっています。したがって、このキャストによって生成されるチェックされていないキャストの警告を自信を持って抑制することができます。これが完了すると、コードはエラーや警告なしでコンパイルされます。UnaryFunction<Object>
UnaryFunction<T>
T
UnaryFunction<T>
T