类不是抽象的,并且不会覆盖Java中的错误

问题描述 投票:11回答:5

我在Java中遇到编译时错误:

MyClass is not abstract and does not override abstract method
onClassicControllerRemovedEvent(
wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent)
in wiiusejevents.utils.WiimoteListener)

这是班级:

import wiiusej.WiiUseApiManager;
import wiiusej.Wiimote;
import wiiusej.wiiusejevents.physicalevents.ExpansionEvent;
import wiiusej.wiiusejevents.physicalevents.IREvent;
import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent;
import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent;
import wiiusej.wiiusejevents.utils.WiimoteListener;
import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent;


public class MyClass implements WiimoteListener{

    public void onButtonsEvent(WiimoteButtonsEvent arg0) {
        System.out.println(arg0);
        if (arg0.isButtonAPressed()){
            WiiUseApiManager.shutdown();
        }
    }

    public void onIrEvent(IREvent arg0) {
        System.out.println(arg0);
    }

    public void onMotionSensingEvent(MotionSensingEvent arg0) {
        System.out.println(arg0);
    }

    public void onExpansionEvent(ExpansionEvent arg0) {
        System.out.println(arg0);
    }

    public void onStatusEvent(StatusEvent arg0) {
        System.out.println(arg0);
    }

    public void onDisconnectionEvent(DisconnectionEvent arg0) {
        System.out.println(arg0);
    }

    public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) {
        System.out.println(arg0);
    }

    public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) {
        System.out.println(arg0);
    }

    public static void main(String[] args) {
        Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(1, true);
        Wiimote wiimote = wiimotes[0];
        wiimote.activateIRTRacking();
        wiimote.activateMotionSensing();
        wiimote.addWiiMoteEventListeners(new MyClass());
    }
}

我可以更好地解释这个错误的含义吗?

java override abstract
5个回答
10
投票

你的类实现了一个接口WiimoteListener,它有一个方法onClassicControllerRemovedEvent。但是,接口中的方法是abstract,这意味着它们基本上只是没有实现的契约。你需要做一件事:

  1. 实现此方法以及此接口声明的所有其他方法,这些方法使您的类具体,或
  2. 声明您的类抽象,因此它不能用于实例化实例,仅用作超类。

6
投票

如何尽可能简单地重现该错误:

Java代码:

package javaapplication3;
public class JavaApplication3 {
    public static void main(String[] args) {
    }
}
class Cat implements Animal{

}

interface Animal{
    abstract boolean roar();
}

显示此编译时错误:

Cat is not abstract and does not override abstract method roar() in Animal

为什么不编译?

因为:

  1. 您创建了一个实现接口Animal的类Cat。
  2. 你的名为Animal的接口有一个名为roar的抽象方法,必须重写它。
  3. 你没有提供方法咆哮。有许多方法可以消除编译时错误。

补救措施1,让Cat覆盖抽象方法roar()

package javaapplication3;

public class JavaApplication3 {
    public static void main(String[] args) {
        Cat c = new Cat();
        System.out.println(c.roar());
    }
}
class Cat implements Animal{ 
    public boolean roar(){
        return true;
    }
}

interface Animal{
    abstract boolean roar();
}

补救措施2,将Cat改为这样的摘要:

package javaapplication3;

public class JavaApplication3 {
    public static void main(String[] args) {
        Cat c;
    }
}
abstract class Cat implements Animal{ 

}
interface Animal{
    abstract boolean roar();
}

这意味着你不能再实例化Cat了。

补救措施3,让猫停止实施动物

package javaapplication3;

public class JavaApplication3 {
    public static void main(String[] args) {
        Cat c = new Cat();
    }
}
class Cat{ 

}

interface Animal{
    abstract boolean roar();
}

这使得怒吼()不再是动物必须知道如何做的事情的合同。

补救措施3,扩展一个类而不是实现一个接口

package javaapplication3;

public class JavaApplication3 {
    public static void main(String[] args) {
        Cat c = new Cat();
        System.out.println(c.roar());
    }
}
class Cat extends Animal{ 

}
class Animal{
    boolean roar(){
        return true;
    }
}

使用的补救措施取决于表示所代表问题的最佳模型。错误是敦促你停止“布朗运动编程”。


3
投票

实现接口时,必须实现该接口中的所有方法。你没有实现onClassicControllerRemovedEvent


2
投票

似乎WiimoteListener是定义onClassicControllerRemovedEvent方法的接口。您的类必须定义接口声明的所有方法,否则将无法编译而不会出错。

也可能是这个类是使用不同版本的WiimoteListener接口设计的(基于包含该接口的jar的旧版本或更新版本),并且该版本没有声明上述方法。如果是这样,它可能只需要根据您的类使用的jar版本进行构建。


0
投票

缺少参数,不一致的参数类型,缺少方法定义,检查所有这些。

就我而言:

public class California {
            @override
            public String transportation(String transportationType, String transportationId, String transportationArea)
        {
        return transportationType;
    } public static void main(String[] args) {
                California c = new California();
            }
        }

        interface Oakland{
           String transportation(String transportationType, String transportationId);
        }

这没有编译,因为运输方法错过了一个参数!

© www.soinside.com 2019 - 2024. All rights reserved.