web-dev-qa-db-ja.com

クラスは抽象ではなく、Java

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

このエラーの意味を詳しく説明できますか?

12
Phil

クラスは、メソッドWiimoteListenerを持つインターフェースonClassicControllerRemovedEventを実装します。ただし、インターフェースのメソッドはabstractです。つまり、これらのメソッドは本質的に、実装のない単なるコントラクトです。ここで次のいずれかを行う必要があります。

  1. このメソッドと、このインターフェースが宣言する他のすべてのメソッドを実装して、クラスを具体化します。
  2. クラスの抽象を宣言します。そのため、インスタンスのインスタンス化には使用できず、スーパークラスとしてのみ使用されます。
10
zw324

そのエラーをできるだけ簡単に再現する方法:

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、猫に抽象メソッド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;
    }
}

使用する救済策は、表されている問題を表すための最良のモデルが何であるかによって異なります。エラーは、「ブラウン運動によるプログラミング」をやめるように促すためのものです。

6
Eric Leschinski

インターフェイスを実装するときは、そのインターフェイスのすべてのメソッドを実装する必要があります。 onClassicControllerRemovedEventを実装していません。

3
Tips48

WiimoteListeneronClassicControllerRemovedEventメソッドを定義するインターフェースのようです。クラスは、インターフェイスが宣言するすべてのメソッドを定義する必要があります。そうしないと、エラーなしでコンパイルされません。

また、このクラスは異なるバージョンのWiimoteListenerインターフェースを使用して設計され(そのインターフェースを含むjarの古いバージョンまたは新しいバージョンに基づく)、そのバージョンは上記のメソッドを宣言していなかった可能性もあります。その場合は、クラスで使用するように作成されたjarのバージョンに対してビルドする必要があるだけかもしれません。

2
Shadow Man

欠落しているパラメータ、一貫性のないパラメータタイプ、欠落しているメソッド定義。これらすべてを確認してください。

私の場合:

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つを見逃したため、これはコンパイルされませんでした!

0
JumpMan