Рассмотрите интерфейс UnaryFunction
, определенный в Эффективная Java-концепция.Почему безопасно подавлять это непроверенное предупреждение?
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
. Но функция идентичности является специальной: она возвращает свой аргумент без изменений, поэтому мы знаем, что он использует тип какUnaryFunction<T>
независимо от значенияT
. Таким образом, мы с уверенностью можем подавить предупреждение без предупреждения, которое генерируется . Как только мы это сделаем, код компилируется без предупреждения или .
Боковой вопрос: какую книгу вы используете, и она говорит, что точка этого кода? – asteri
@Jeff Эффективная java - это имя книги, и она есть в главе generics, особенно в разделе, описывающем общие функции. – Geek