Тип параметра Java Abstract Method
У меня проблема с реализацией абстрактного класса. Я объявляю Abstract Method с List в качестве параметра в AbstractClass, но когда я его реализую, он дает мне ошибки компиляции, говоря, что я не правильно реализовал абстрактный cass, который я расширяю.
public abstract class MyAbstractClass<T> {
abstract protected List<T> MyMethod(List<String> list);
}
public class MyClass<MyObject> extends MyAbstractClass {
@Override
protected List<MyObject> MyMethod(List<String> list){
//Do Stuff
}
}
Всякий раз, когда я реализую это автоматически, это делает List<String>
чтобы просто List
, Есть ли причина для этого? Благодарю.
4 ответа
Я верю, что вы хотите это:
public class MyClass extends MyAbstractClass<MyObject> {
@Override
protected List<MyObject> MyMethod(List<String> list){
//Do Stuff
}
}
Я думаю ты хотел сказать
public class MyClass extends MyAbstractClass<MyObject>
который сказал бы, что MyClass
использования MyObject
для параметра типа T
,
Вы сказали, что MyClass
имеет параметр типа, который не имеет отношения к параметру типа базового класса T
, Так что в этом случае MyAbstractClass
ссылка может указывать на MyClass
экземпляр, и пользователи этой ссылки не должны знать, что у них есть MyClass
поэтому они не могут быть ограничены T
быть MyClass
,
Измените это на
extends MyAbstractClass<MyObject>
проверил это в Eclipse, и это работает.
Это также кажется логичным, поскольку суперкласс может знать, какой тип вы хотите вернуть, только если вы дадите ему этот тип. И если вы не дадите ему тип, он должен обобщить.
Вопрос двусмысленный, поэтому я отвечаю на два возможных случая
MyObject - это класс
public class MyClass extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }
Вы использовали MyObject просто как универсальный и назвали его так, тогда, тот же тип передается родителю, как показано ниже
public class MyClass<MyObject> extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }