我在实现抽象类时遇到问题。我正在声明一个抽象方法,其中 List 作为 AbstractClass 中的参数,但是当我实现它时,它给了我编译错误,说我没有正确实现抽象 cass im extending。
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
.这有什么原因吗?谢谢。
你想要的是这个:
public class MyClass extends MyAbstractClass<MyObject> {
@Override
protected List<MyObject> MyMethod(List<String> list){
//Do Stuff
}
}
我想你想说
public class MyClass extends MyAbstractClass<MyObject>
也就是说,MyClass
对类型参数T
使用 MyObject
。
你说的是MyClass
有一个类型参数,它与基类的类型参数T
没有关系。 因此,在这种情况下,MyAbstractClass
引用可以指向MyClass
实例,并且该引用的用户不需要知道他们有MyClass
,因此他们不会受到必须MyClass
T
约束。
将其更改为
extends MyAbstractClass<MyObject>
在Eclipse中测试了它,并且有效。
这似乎也是合乎逻辑的,因为超类只有在您为其提供该类型时才能知道您要返回的类型。如果你不给它一个类型,它必须概括。
这个问题有歧义,所以我回答了两种可能的情况
-
MyObject 是一个类
public class MyClass extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }
-
你把MyObject当作一个泛型,然后像这样命名,将相同的类型传递给父级,如下所示
public class MyClass<MyObject> extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }