Тип безопасности: снятый флажок из объекта
Я пытаюсь применить объект к моему классу Action, но это приводит к предупреждению:
Type safety: Unchecked cast from Object to Action<ClientInterface>
Action<ClientInterface> action = null;
try {
Object o = c.newInstance();
if (o instanceof Action<?>) {
action = (Action<ClientInterface>) o;
} else {
// TODO 2 Auto-generated catch block
throw new InstantiationException();
}
[...]
Спасибо за любую помощь
Ответы
Ответ 1
Да - это естественное следствие типа erasure. Если o
на самом деле является экземпляром Action<String>
, который не будет улавливаться приложением - вы увидите проблему только при попытке использовать его, передав вместо ClientInterface
строку.
Вы можете избавиться от предупреждения, используя:
@SuppressWarnings("unchecked")
как аннотацию функции, но вы не можете легко решить основную проблему: (
Ответ 2
Как обычно, Джон Скит прав.
Продумать нелегкую часть его ответа:
Учитывая
class ClientAction implements Action<ClientInterface> {}
Вы можете написать:
Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();
Это исключает как бросок, так и предупреждение, ценой введения нестандартного типа, поэтому вы можете использовать .class
для получения достаточно точно типизированного объекта Class
.
Ответ 3
Предупреждение означает, что компилятор не может гарантировать безопасность типа, даже если отливка работает нормально во время выполнения. Из-за стирания во время выполнения кастинг - это просто литье в действие. Возможно, что базовый класс generic не является типом ClientInterface, как ожидалось. В этом случае проблема появится позже (возможно, даже намного позже), как ClassCastException.
В этом конкретном случае я рекомендую подавить это конкретное предупреждение с помощью следующей директивы компилятора:
@SuppressWarnings("unchecked")
Ответ 4
Не беспокойтесь. Это связано с тем, что компилятор Java не знает, каков реальный тип объекта.
Ответ 5
Вы потеряли информацию о типе из-за стирания (т.е. параметризованные типы были стерты), поэтому предупреждение. Вы ничего не можете с этим поделать, кроме как очистить окружающий код, чтобы чаще использовать генераторы, поэтому вы можете передавать информацию об общем типе и избегать кастинга вообще.