Java抽象方法参数类型

时间:2017-03-15 16:45:40

标签: java abstract-class abstract-methods generic-type-argument

我在实现抽象类时遇到了问题。我在AbstractClass中声明了一个带有List作为参数的抽象方法,但是当我实现它时,它给了我编译错误,说我没有正确实现抽象cass im扩展。

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。 这有什么理由吗?感谢。

4 个答案:

答案 0 :(得分:1)

我相信你想要的是:

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

}

答案 1 :(得分:1)

我想你想说

public class MyClass extends MyAbstractClass<MyObject>

表示MyClass使用MyObject作为参数T

你所说的是MyClass有一个类型参数,它与基类的类型参数T没有关系。因此,在这种情况下,MyAbstractClass引用可能指向MyClass实例,该引用的用户无需知道他们有MyClass因此不能被{T约束1}}必须是MyClass

答案 2 :(得分:0)

将其更改为

extends MyAbstractClass<MyObject>

在Eclipse中测试它并且有效。

它似乎也是逻辑,因为超类只能知道你想要返回的类型。如果你不给它一个类型,它必须概括。

答案 3 :(得分:0)

问题含糊不清所以我回答了两个可能的案例

  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 } }