Добро пожаловать в стирание типов. Во время выполнения Class<T>
был стерт до Class
- для JVM, то, что было в исходном коде Class<Integer>
, Class<String>
и т. д., все выглядит одинаково. В этом смысл предупреждения непроверенное приведение — разработчик делает это на свой страх и риск, потому что оно не быстро выйдет из строя с ClassCastException
, если оно неправильный. Вместо этого некоторые более поздние ClassCastException
могут возникать вместо приведения, которое было вставлено компилятором во время процесса стирания типа. Это состояние, в котором ссылки общего типа указывают на объекты, к которым им не должно быть разрешено, известно как загрязнение кучи.
МОЙ БОГ. - есть ли лучший способ применить аргумент типа?
Нет, это лучшее, что может предложить Java с точки зрения универсальной безопасности типов — это действительно необязательно. Ленивый или оскорбительный код может выполнять непроверенные приведения или использовать необработанные типы (которые вызывают неявное непроверенное приведение ко всему, к чему они прикасаются), хотя многие IDE предлагают делать эти ошибки компилятора вместо предупреждений.
В качестве примечания, непроверенные приведения иногда допустимы, например, при реализации пункта 27 Джошуа Блоха Effective Java, "отдавать предпочтение универсальным методам":
private static final Comparator<Object> HASH_CODE_COMPARATOR =
new Comparator<Object>() {
@Override
public int compare(final Object o1, final Object o2) {
return Integer.compare(o1.hashCode(), o2.hashCode());
}
};
public static <T> Comparator<T> hashCodeComparator() {
@SuppressWarnings("unchecked") // this is safe for any T
final Comparator<T> withNarrowedType =
(Comparator<T>)(Comparator<?>)HASH_CODE_COMPARATOR;
return withNarrowedType;
}
Здесь непроверенное приведение безопасно, потому что HASH_CODE_COMPARATOR
ведет себя контравариантно. Он не имеет состояния и работает для любого Object
, поэтому мы можем позволить вызывающей стороне определить его универсальный тип:
Comparator<String> c = hashCodeComparator();
В этом случае мы можем использовать @SuppressWarnings("unchecked")
, чтобы удалить непроверенное предупреждение, по сути сообщая компилятору, что нам доверяют. Также рекомендуется добавить пояснительный комментарий.
person
Paul Bellora
schedule
03.09.2013
unchecked cast
. Но я имею в виду, что кто-то может намеренно сломать (взломать) это правоприменение. - person midnite   schedule 03.09.2013