Подтвердить что ты не робот

Тип безопасности: снятый флажок из объекта

Я пытаюсь применить объект к моему классу 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();
 }
 [...]

Спасибо за любую помощь

4b9b3361

Ответ 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

Вы потеряли информацию о типе из-за стирания (т.е. параметризованные типы были стерты), поэтому предупреждение. Вы ничего не можете с этим поделать, кроме как очистить окружающий код, чтобы чаще использовать генераторы, поэтому вы можете передавать информацию об общем типе и избегать кастинга вообще.