给定两个抽象类,AClass1和AClass2,第一个有一个抽象方法,使用第二个作为参数,如何在没有Java抱怨未实现的抽象方法的情况下使用这些抽象类的子类一起工作? / p>
public abstract class AClass1 {
...
public abstract void aMethod(AClass2 param1, int param2, ... );
...
}
public abstract class AClass2 {
...
}
public class CClass1 extends AClass1 {
...
public void aMethod(CClass2 param1, int param2, ...) {
...
}
public class CClass2 extends AClass2 {
...
}
我认为具体的类CClass1会没问题,但Java会让我实现public void aMethod(AClass ...)
。
我做错了什么?
答案 0 :(得分:4)
CClass1必须实现一个方法,它可以接受任何AClass2,因为你已经指定了它。您可以重载此方法,但必须实现父方法的抽象方法。
答案 1 :(得分:1)
您必须在具体课程中保留正确的签名:
public abstract void aMethod(AClass2 param1, int param2, ... );
答案 2 :(得分:0)
Java仅支持covariant return types,而不支持协变参数类型。
如果不是这样,假设您获得了子类的实例,但将其称为抽象类:
AClass1 a = new CClass1();
AClass2 param = new AnotherCClass();
a.aMethod(param); // ClassCastException - can't cast AnotherCClass to CClass2
答案 3 :(得分:0)
我知道这个问题现在已经过时了,但最近我遇到了同样的问题。
我最后做的是,我没有定义抽象类,而是为子类定义了一个接口。
这样您很遗憾无法共享方法实现,但您可以为它们创建模板,并且根据您的IDE,将自动为您生成方法。