Как решить «непроверенное» предупреждение Java о классе, требующем расширения из определенного класса?

#java #class #generics

#java #класс #дженерики

Вопрос:

В моем приложении Android Java у меня есть метод:

 private <T extends Message> ReturnObject doSomething(Class<T> type) {
    // Implementation
}
  

Как вы видите, параметр type должен распространяться на класс Message .

Теперь это так; Я вызываю метод doSomething , подобный:

 @Override
public void myMethod(Class type){
    doSomething(type);
}
  

Обратите внимание, что мой метод переопределяет другой метод.

Всплывающее предупреждение:

 [unchecked] unchecked method invocation: method doSomething in class 
Class is applied to given types
required: Class<T>
found: Class
where T is a type-variable:
T extends Message declared in method <T>doSomething(String,Class<T>)
  

Как я могу решить это предупреждение?

Комментарии:

1. Можете ли вы поделиться кодом полной функции?

2. Спасибо @Pshemo. Халид, я думаю, что остальная часть кода не имеет отношения к этому вопросу

3. «найдено: класс». Итак, вы даете ему необработанный тип. Пожалуйста, покажите, как вы вызываете этот метод.

4. Ваш вызов метода должен быть чем-то вроде doSomething(Message.class)

5. Вы используете необработанный тип. Никогда не делайте этого.

Ответ №1:

 @Override
public void myMethod(Class type) {
    Class<? extends Message> mtype = type.asSubclass(Message.class);
    doSomething(mtype);
}
  

Лучше всего было бы удалить переопределенный метод, не являющийся универсальным небезопасным типом:

 public void myMethod(Class<?> type) {
  

И еще лучше исправить метод базового класса.

Ответ №2:

Возможно, вы захотите передать тип класса в параметре, а не только класс, как показано ниже

 @Override
public void myMethod(Class<T> type){//I've changed the parameter from Class to Class<T>
    doSomething(type);
}
  

Ответ №3:

Это должно выглядеть так

 public <T extends Message> void myMethod(Class<T> type){
    doSomething(type);
}
  

Комментарии:

1. Если я изменю его таким образом, я получу сообщение об ошибке: Invalid method declaration; return type required

2. @Klyner Я не проверял синтаксис, вероятно, <…> идет перед объявлением возвращаемого типа (void).

3. О, подождите, я забыл упомянуть, что myMethod это переопределяет другой метод, имеющий параметр type с типом Class , поэтому я думаю, что мне нужно преобразовать его или что-то в этом роде.