Безопасность с точки зрения типов: Неконтролируемый бросок от Объекта

Я пытаюсь бросить объект к своему классу Действия, но он приводит к предупреждению:

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();
 }
 [...]

Спасибо за любую справку

43
задан Joachim Sauer 7 April 2010 в 13:24
поделиться

5 ответов

Да - это естественное следствие стирания типа . Если o на самом деле является экземпляром Action , который не будет перехвачен приведением - вы увидите проблему только тогда, когда попытаетесь использовать его, передавая ClientInterface вместо строки.

Вы можете избавиться от предупреждения, используя:

@SuppressWarnings("unchecked")

в качестве аннотации функции, но вы не можете легко решить основную проблему: (

64
ответ дан 26 November 2019 в 22:48
поделиться

Как всегда, Джон Скит прав.

Чтобы уточнить нелегкую часть его ответа:

Учитывая

class ClientAction implements Action<ClientInterface> {}

Вы можете написать:

Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();

Это устраняет как приведение, так и предупреждение, ценой введения неуниверсального типа, чтобы вы можно использовать .class , чтобы получить достаточно точно типизированный объект Class .

15
ответ дан 26 November 2019 в 22:48
поделиться

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

1
ответ дан 26 November 2019 в 22:48
поделиться

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

В этом конкретном случае я рекомендую подавить это конкретное предупреждение с помощью следующей директивы компилятора:

@SuppressWarnings("unchecked")
6
ответ дан 26 November 2019 в 22:48
поделиться

Не беспокойтесь об этом. Это потому, что компилятор Java не может узнать, каков настоящий тип объекта.

2
ответ дан 26 November 2019 в 22:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: