Наследование класса с абстрактным методом, принимающим в качестве аргумента список наследников этого класса
Есть такой код:
public abstract class MyObject {
private volatile int id;
public synchronized int getId()
{
return this.id;
}
public abstract <T extends MyObject> int compareTo(T object);
public boolean inList(List<? extends MyObject> list)
{
for (MyObject myobject : list)
if (this.compareTo(myobject) == 0)
return true;
return false;
}
}
Как мне унаследовать класс, чтобы метод inList() принимал объект List<ChildClass> list, а не List<? extends MyObject> list? То же касается и аргумента метода compareTo()
Ответы (2 шт):
Автор решения: Виктор
→ Ссылка
public abstract class MyObject<T extends MyObject>
а в методах использовать T
public abstract <T> int compareTo(T object);
public boolean inList(List<T> list)
{
for (MyObject myobject : list)
if (this.compareTo(myobject) == 0)
return true;
return false;
}
Создавая наследника можно указать на себя же
public abstract class ChildClass extends MyObject<ChildClass>
соответственно при переопределении T заменится на ChildClass
Автор решения: Roman C
→ Ссылка
Можно использовать метод со следующей сигнатурой
public <T extends MyObject> boolean inList(List<T> list);