У меня есть задача, в которой я должен реализовать метод add()
для настраиваемого общего списка. В моем коде у меня есть следующая структура:
public abstract class MyGenericListAbstract<T> {
protected transient T head;
protected transient T tail;
protected transient int size;
...
}
public final class MyEmptyList<T> extends MyGenericListAbstract {
private T[] list;
...
public final void add(T e)
{
this.getList()[this.size()] = (T) e;
}
...
private T[] getList()
{
return this.list;
}
}
Проблема, которую я сейчас имею в виду, заключается в том, что когда я пытаюсь сделать это:
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
MyGenericListAbstract <Integer> list0 = new MyEmptyList();
list0.add(new Integer(3));
}
}
Я получаю следующую ошибку:
и я не могу понять, почему...
Кто-нибудь может мне помочь, пожалуйста!
Весь код доступен здесь, а также некоторые документы о задаче здесь. Если вы заметите некоторые недостатки, я буду рад услышать их!
Благодарю!
Вы MyGenericListAbstract <Integer>
ссылку на MyGenericListAbstract <Integer>
в list0
тогда как у нее нет метода add
, как вы уже говорили в комментарии. Компилятор не видит этот метод на основе ссылки на список.
Вы должны либо изменить ссылочный тип на MyEmptyList <Integer>
либо перенести метод add(T e)
в класс MyGenericListAbstract
.
PS. Проблема не связана с дженериками, это просто основной принцип наследования Java.
MyGenericListAbstract
методadd
?public final class MyEmptyList<T> extends MyGenericListAbstract
. Это использует необработанный типMyGenericListAbstract
. Попробуйтеpublic final class MyEmptyList<T> extends MyGenericListAbstract<T>
. Аналогичным образом, вам, вероятно, следует использоватьMyGenericListAbstract <Integer> list0 = new MyEmptyList<>();
, Избегайте необработанных типов, насколько это возможно.