Я пытаюсь бросить объект к своему классу Действия, но он приводит к предупреждению:
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
, который не будет перехвачен приведением - вы увидите проблему только тогда, когда попытаетесь использовать его, передавая ClientInterface
вместо строки.
Вы можете избавиться от предупреждения, используя:
@SuppressWarnings("unchecked")
в качестве аннотации функции, но вы не можете легко решить основную проблему: (
Как всегда, Джон Скит прав.
Чтобы уточнить нелегкую часть его ответа:
Учитывая
class ClientAction implements Action<ClientInterface> {}
Вы можете написать:
Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();
Это устраняет как приведение, так и предупреждение, ценой введения неуниверсального типа, чтобы вы можно использовать .class
, чтобы получить достаточно точно типизированный объект Class
.
Вы потеряли информацию о типе из-за стирания (т.е. были стерты параметризованные типы), отсюда и предупреждение. Вы ничего не можете с этим поделать, кроме как очистить окружающий код, чтобы универсальные типы использовались чаще, чтобы вы могли передавать информацию об универсальном типе и вообще избегать приведения типов.
Предупреждение означает, что компилятор не может гарантировать безопасность типов, даже если приведение типов работает нормально во время выполнения. Из-за стирания во время выполнения приведение является просто приведением к действию. Возможно, что базовый универсальный класс не относится к типу ClientInterface, как ожидалось. В этом случае проблема появится позже (возможно, даже намного позже) в виде ClassCastException.
В этом конкретном случае я рекомендую подавить это конкретное предупреждение с помощью следующей директивы компилятора:
@SuppressWarnings("unchecked")
Не беспокойтесь об этом. Это потому, что компилятор Java не может узнать, каков настоящий тип объекта.