Вопрос

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

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

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

Это было полезно?

Решение

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

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

@SuppressWarnings("unchecked")

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

Другие советы

Как обычно, Джон Скелет прав.

Разработать на нелегком его ответе:

Дано

class ClientAction implements Action<ClientInterface> {}

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

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

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

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

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

@SuppressWarnings("unchecked")

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

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

Это нисходящий. Это динамический листок, где компилятор не имеет представления о фактическом объекте, который указывает на.

Вы получаете это предупреждение, потому что целевой тип актеров Action<ClientInterface> это Параметризованный тип И компилятор не может гарантировать, что встроенный тип объекта имеет один и тот же тип.

Если вы не хотите подавлять это предупреждение и не заботитесь о параметре типа, вы можете изменить код для этого с помощью подстановочных знаков:

Action<?> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<?>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

Это намного безопаснее, потому что instanceof не могу проверить это o это объект Action<ClientInterface>, это просто проверить, если o это объект Action Поскольку дополнительный универсальный тип информации будет стертый во время выполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top