我正在尝试使用泛型扩展一个抽象类,我遇到了一个问题:
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没有看到构造函数的任何问题,但我不能在someMethod方法中使用SomeClassA中的ArrayList。所以我试过了:
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的声明中有一个“&gt; expected”,它只是不会编译。如果可能的话,我想:
知道如何解决这个特殊问题。
要善于理解泛型。
要知道C#中是否更容易。
答案 0 :(得分:10)
您还需要将泛型类型传递给超类,如下所示:
abstract public class SomeClassB<Z extends Stuff> extends SomeClassA<Z>
您的超类和子类将使用相同的泛型类型。通用类型不是由子类继承或传递给超类。
答案 1 :(得分:2)
要了解泛型,请查看Effective Java, 2nd Edition。