16

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

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

4

5 回答 5

16

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

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,让 cat 停止执行 Animal

package javaapplication3;

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

}

interface Animal{
    abstract boolean roar();
}

这使得 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;
    }
}

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

于 2015-02-19T19:01:26.087 回答
11

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

  1. 实现这个方法和这个接口声明的所有其他方法,使你的类具体化,或者
  2. 声明您的类抽象,因此它不能用于实例化实例,只能用作超类。
于 2013-05-15T00:19:49.977 回答
3

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

于 2013-05-15T00:19:21.037 回答
2

看起来这WiimoteListener是一个定义onClassicControllerRemovedEvent方法的接口。您的类必须定义接口声明的所有方法,否则它将无法编译而不会出现错误。

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

于 2013-05-15T00:23:53.533 回答
1

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

就我而言:

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

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

于 2019-03-08T02:50:41.323 回答