Java 抽象方法参数类型



我在实现抽象类时遇到问题。我正在声明一个抽象方法,其中 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中测试了它,并且有效。

这似乎也是合乎逻辑的,因为超类只有在您为其提供该类型时才能知道您要返回的类型。如果你不给它一个类型,它必须概括。

这个问题有歧义,所以我回答了两种可能的情况

  1. MyObject 是一个类

    public class MyClass extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }

  2. 你把MyObject当作一个泛型,然后像这样命名,将相同的类型传递给父级,如下所示

    public class MyClass<MyObject> extends MyAbstractClass<MyObject> { @Override protected List<MyObject> MyMethod(List<String> list) { // do stuff } }

最新更新