Наследование Java и дженерики
Я пытаюсь расширить абстрактный класс с помощью обобщений, и я столкнулся с проблемой:
abstract public class SomeClassA<S extends Stuff> {
protected ArrayList<S> array;
public SomeClassA(S s) {
// ...
}
public void someMethod() {
// Some method using the ArrayList
}
abstract public void anotherMethod() {
// ...
}
}
Теперь я хочу расширить этот класс другим абстрактным классом, чтобы я мог переопределить "someMethod". Я старался:
abstract public class SomeClassB<Z extends Stuff> extends SomeClassA {
public SomeClassB(Z z) {
super(z);
}
@Override public void someMethod() {
// Some method using the ArrayList
}
}
NetBeans не видит никаких проблем с конструктором, но я не могу использовать ArrayList из SomeClassA в методе someMethod. Итак, я попробовал:
abstract public class SomeClassB<Z extends Stuff> extends SomeClassA<S extends Stuff> {
public SomeClassB(Z z) {
super(z);
}
@Override public void someMethod() {
// Some method using the ArrayList
}
}
А сейчас это просто очень странно. Кажется, что все работает (и теперь я могу использовать arraylist, но NetBeans говорит, что в объявлении SomeClassB есть "ожидаемый", и он просто не будет компилироваться. Если возможно, я бы хотел:
Чтобы узнать, как решить эту конкретную проблему.
Иметь хорошую ссылку для понимания дженериков.
Чтобы узнать, проще ли в C#.
2 ответа
Вам также нужно будет передать универсальный тип суперклассу, например так:
abstract public class SomeClassB<Z extends Stuff> extends SomeClassA<Z>
Ваш суперкласс и подкласс будут оба использовать один и тот же универсальный тип. Универсальные типы не наследуются подклассами и не передаются суперклассам.
Для хорошего понимания дженериков, ознакомьтесь с Effective Java, 2nd Edition.