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());
}
}
このエラーの意味を詳しく説明できますか?
クラスは、メソッドWiimoteListener
を持つインターフェースonClassicControllerRemovedEvent
を実装します。ただし、インターフェースのメソッドはabstract
です。つまり、これらのメソッドは本質的に、実装のない単なるコントラクトです。ここで次のいずれかを行う必要があります。
そのエラーをできるだけ簡単に再現する方法:
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、猫に抽象メソッド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();
}
これにより、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;
}
}
使用する救済策は、表されている問題を表すための最良のモデルが何であるかによって異なります。エラーは、「ブラウン運動によるプログラミング」をやめるように促すためのものです。
インターフェイスを実装するときは、そのインターフェイスのすべてのメソッドを実装する必要があります。 onClassicControllerRemovedEvent
を実装していません。
WiimoteListener
はonClassicControllerRemovedEvent
メソッドを定義するインターフェースのようです。クラスは、インターフェイスが宣言するすべてのメソッドを定義する必要があります。そうしないと、エラーなしでコンパイルされません。
また、このクラスは異なるバージョンのWiimoteListener
インターフェースを使用して設計され(そのインターフェースを含むjarの古いバージョンまたは新しいバージョンに基づく)、そのバージョンは上記のメソッドを宣言していなかった可能性もあります。その場合は、クラスで使用するように作成されたjarのバージョンに対してビルドする必要があるだけかもしれません。
欠落しているパラメータ、一貫性のないパラメータタイプ、欠落しているメソッド定義。これらすべてを確認してください。
私の場合:
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);
}
輸送方法がパラメータの1つを見逃したため、これはコンパイルされませんでした!