Java:无法覆盖传递子类的抽象方法

时间:2016-06-01 13:09:32

标签: java abstract-class subclass extend

我有一个抽象类

public abstract class SuperclassA{
   public abstract void method(SuperclassB b);
}

一个实现

public class SubclassA extends SuperclassA{

   @override
   public void method(SubclassB b){
   }
}

其中SubclassB extends SuperclassB

我的NetBeans编辑器抱怨我没有覆盖method。 如何将子类实际传递给method

5 个答案:

答案 0 :(得分:5)

为了覆盖基类的方法,子类的方法必须具有相同的签名。

如果您希望重写的方法只接受SubclassB的实例,则可以测试它:

public class SubclassA extends SuperclassA
{
   @Override
   public void method(SuperclassB b){
       if (!(b instanceof SubclassB)) {
           // throw some exception
       }
       SubclassB sb = (SubclassB) b;
       ...
   }
}

您可以按如下方式调用该方法:

SuperclassA a = new SubclassA ();
a.method (new SubclassB ());

答案 1 :(得分:1)

将类或接口的方法签名视为契约或承诺,以及它和任何子类可以执行的操作。

SuperclassA承诺为任何method行动SuperclassB。要使SubclassA成为SuperclassA,必须为所有 method执行SuperclassB操作。问题是它只对某些类型的method执行操作SuperclassB

以下是名称更容易理解的情况。

abstract class Pet {
    // Pet methods
}

class Cat extends Pet {
    // Cat methods
}

class Dog extends Pet {
    // Dog methods
}

abstract class PetShop {
    public abstract void groom(Pet pet);
}

宠物店类承诺任何PetShop都可以培养任何宠物,包括狗。

PetShop shop = new FranksPetShop();
shop.groom(new Dog());

如果我们定义FranksPetShop,那么它只定义了如何修饰猫,任何其他类型的宠物(包括狗)都没有定义。

class FranksPetShop {
    @Override
    public abstract void groom(Cat cat) {
        // Groom that cat
    }
}

要解决这个问题,FranksPetShop必须定义如何培养Pet而不仅仅是Cat。

class FranksPetShop {
    @Override
    public abstract void groom(Pet pet) {
        // Groom that pet
    }
}

答案 2 :(得分:0)

  

实际,方法签名是,

public abstract void method(SuperclassB b);// into abstract class
  

您的覆盖方法签名必须相同,否则不是   override,实际上它将被视为overloading

@override
   public void method(SuperclassB b){
   }

  //OverLoad not Override
   public void method(SubclassB b){
   }

答案 3 :(得分:0)

SubclassA中的方法采用SubclassB类型。 SuperclassA中的方法采用SuperclassB类型。您没有覆盖父类方法,而是使用其他类型进行重载。

根据您要完成的任务,您可以尝试这个

public class SubclassA extends SuperclassA{

   @override
   public void method(SuperclassB b){
   }
}

哪个会覆盖你想要的方法。只要SubclassBSuperclassB的孩子,您就仍然可以通过SubclassB

如果需要,您仍然可以使用重载方法接收Subclasss

public class SubclassA extends SuperclassA{

   @override
   public void method(SuperclassB b){
   }

   public void method(SubclassB b){
   }
}

请查看this thread以获取有关重载和覆盖的更多信息。

答案 4 :(得分:0)

请参阅override上的oracle文档页面。

  

具有相同签名(名称,加上其参数的数量和类型)的子类中的实例方法以及作为超类中的实例方法的返回类型将覆盖超类的方法。

子类覆盖方法的能力允许类从超类继承,其行为足够接近"然后根据需要修改行为。

  

重写方法具有相同的名称,参数的数量和类型,以及返回类型作为覆盖的方法

在您的情况下,您没有使用相同的方法签名。

public void method(SubclassB b){

应改为

public void method(SuperclassB b){

现在,您可以使用instanceof

来使用Eran建议的解决方法