Я читаю Дж. Блоха эффективную Java, и теперь я нахожусь в разделе массивов и списков. Вот пример непроверенного актера, который он предоставил:
interface Function<T> {
T apply(T arg1, T arg2);
}
public class Main{
public static void main( String[] args ){
Function<String> f = null;
List<String> str = Arrays.asList("asd");
//staff
reduce(str, f, ""); //E deduced to String. Where is type-unsafe?
}
static <E> E reduce(List<E> list, Function<E> f, E initVal) {
E[] snapshot = (E[]) list.toArray(); // Unchecked cast
E result = initVal;
for (E e : snapshot)
result = f.apply(result, e);
return result;
}
}
Он сказал, что метод не безопасен для типа, и мы можем легко получить ClassCastException
. Но я не понимаю, как это сделать. Если тип-небезопасный, переменная типа E
всегда будет выводиться соответствующему типу, поэтому мы не будем беспокоиться о том, что класс-литье-лишение.
Не могли бы вы привести пример с метанием ClassCastException
?