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

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

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

这是class级:

 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()); } } 

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

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

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

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

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

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

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

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

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