Betrachten Sie die UnaryFunction
Schnittstelle definiert in Wirksame Java Generika Kapitel.Warum ist es sicher, diese ungeprüfte Warnung zu unterdrücken?
public interface UnaryFunction<T> {
T apply(T arg);
}
und der folgende Code für die sichere 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;
}
Warum ist die Besetzung von IDENTITY_FUNCTION
zu (UnaryFunction<T>)
Rückkehr?
Das Buch sagt das über die Frage, die ich stelle, aber ich kann die Logik hier nicht folgen. Wo rufen wir die apply
-Funktion auf, die die Identitätsoperation ausführt? Ich bin verwirrt, weil es diese Funktion ist, die das gleiche Objekt zurückgibt, ohne etwas zu verändern.
Die Besetzung von IDENTITY_FUNCTION zu
(UnaryFunction<T>)
erzeugt eine ungeprüften Guss Warnung, alsUnaryFunction<Object>
keineUnaryFunction<T>
für jedenT
ist. Aber die Identität Funktion ist speziell: es gibt sein Argument unverändert, so dass wir wissen, dass es typsicher es alsUnaryFunction<T>
was auch immer der Wert vonT
ist. Daher können wir die ungeprüfte Cast-Warnung unterdrücken, die von dieser Besetzung generiert wird. Sobald wir dies getan haben, kompiliert der Code ohne Fehler oder Warnung.
Side Frage: Welches Buch verwenden Sie, und sagt es, was der Punkt dieses Codes ist? – asteri
@Jeff Wirksames Java ist der Buchname und es ist dort im Kapitel Generika, speziell in dem Abschnitt, der generische Funktionen beschreibt. – Geek