#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
, поэтому я думаю, что мне нужно преобразовать его или что-то в этом роде.