Rozważmy interfejs UnaryFunction
zdefiniowany w Efektywny rozdział dotyczący generics Java.Dlaczego można ukryć to niezaznaczone ostrzeżenie?
public interface UnaryFunction<T> {
T apply(T arg);
}
i następujący kod do zwrotu 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;
}
Dlaczego obsada IDENTITY_FUNCTION
do (UnaryFunction<T>)
bezpieczne?
Książka mówi o tym pytaniu, ale nie mogę podążać za logiką tutaj. Gdzie wywoływamy funkcję apply
, która wykonuje operację tożsamości? jestem zdezorientowany, ponieważ jest to funkcja, która zwraca ten sam obiekt przekazany do niego bez modyfikowania czegokolwiek.
Obsada IDENTITY_FUNCTION do
(UnaryFunction<T>)
generuje ostrzeżenie niezaznaczone odlewu, jakUnaryFunction<Object>
nie jestUnaryFunction<T>
dla każdegoT
. Ale funkcja tożsamości jest wyjątkowa: to zwraca niezmienioną argumentację, więc wiemy, że jest to bezpieczne w użyciu przy użyciu jakoUnaryFunction<T>
niezależnie od wartościT
. W związku z tym możemy z całą pewnością ukryć niezaznaczone ostrzeżenie, które zostało wygenerowane przez tę obsadę w postaci . Gdy to zrobimy, kod kompiluje się bezbłędnie lub ostrzeżenie .
Side: jaka książka używasz, i to powiedzieć o co chodzi z tym kodem jest? – asteri
@Jeff Efektywna Java jest nazwą książka i jest tam w generyków rozdziału, w szczególności w części opisującej funkcje generyczne. – Geek