0

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

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

+2

请说明你是如何“执行”它。我猜你正在使用原始类型。 –

+1

你可能想要公共类MyClass extends MyAbstractClass { –

回答

1

我相信你想要的东西是这样的:

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

} 
+0

:P是的,就是这样。我不认为这会解决我的问题,因为它抱怨一个与MyObject无关的参数。 – CovaDax

1

我想你的意思是说

public class MyClass extends MyAbstractClass<MyObject> 

它会说,MyClass使用MyObject的类型参数T

你所说的是MyClass有一个类型参数,它与基类的类型参数T没有任何关系。所以在这种情况下,MyAbstractClass参考可能指向MyClass实例,并且该参考的用户无需知道他们有MyClass,因此他们不能受到T必须为MyClass的限制。

0

将其更改为

extends MyAbstractClass<MyObject> 

在Eclipse测试它与工程。

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

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