Considerare l'interfaccia UnaryFunction
definita nel capitolo Java efficace generici.Perché è sicuro sopprimere questo avviso non controllato?
public interface UnaryFunction<T> {
T apply(T arg);
}
e il seguente codice per la restituzione 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;
}
Perché il cast di IDENTITY_FUNCTION
a (UnaryFunction<T>)
sicuro?
Il libro dice questo sulla domanda che sto chiedendo ma non posso seguire la logica qui. Dove stiamo invocando la funzione apply
che esegue l'operazione di identità? Sono confuso perché è quella funzione che restituisce lo stesso oggetto passato senza modificare nulla.
Il cast di il_più_grande_comune_divisore ad
(UnaryFunction<T>)
genera un allarme incontrollato cast, comeUnaryFunction<Object>
non è unUnaryFunction<T>
per ogniT
. Ma la funzione di identità è speciale: è restituisce il suo argomento non modificato, quindi sappiamo che è typesa da usare comeUnaryFunction<T>
qualunque sia il valore diT
. Pertanto, possiamo sopprimere con sicurezza l'avviso di cast non controllato generato da questo cast. Una volta fatto, il codice viene compilato senza errori o con l'avviso .
Domanda laterale: che libro stai usando e dice qual è il punto di questo codice? – asteri
@Jeff Efficace java è il nome del libro ed è lì nel capitolo generici, in particolare nella sezione che descrive le funzioni generiche. – Geek