Тип параметра 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, и это работает.

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

Вопрос двусмысленный, поэтому я отвечаю на два возможных случая

  1. MyObject - это класс

    public class MyClass extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }

  2. Вы использовали MyObject просто как универсальный и назвали его так, тогда, тот же тип передается родителю, как показано ниже

    public class MyClass<MyObject> extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }

Другие вопросы по тегам