Die Klasse ist nicht abstrakt und überschreibt Fehler in Java nicht

Lesezeit: 4 Minuten

Benutzer-Avatar
Phil

Ich erhalte einen Kompilierzeitfehler mit Java:

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

Hier ist die Klasse:

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

Kann ich besser erklären, was dieser Fehler bedeutet?

So reproduzieren Sie diesen Fehler möglichst einfach:

Java-Code:

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

}

interface Animal{
    abstract boolean roar();
}

Zeigt diesen Kompilierzeitfehler:

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

Warum wird es nicht kompiliert?

Weil:

  1. Sie haben eine Klasse Cat erstellt, die ein Interface Animal implementiert.
  2. Ihre Schnittstelle namens Animal hat eine abstrakte Methode namens roar, die überschrieben werden muss.
  3. Sie haben nicht für Methodengebrüll gesorgt. Es gibt viele Möglichkeiten, den Kompilierzeitfehler zu beseitigen.

Abhilfe 1, Cat soll die abstrakte Methode roar() überschreiben

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

Abhilfe 2, ändern Sie Cat in ein Abstract wie dieses:

package javaapplication3;

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

}
interface Animal{
    abstract boolean roar();
}

Das bedeutet, dass Sie Cat nicht mehr instanziieren können.

Abhilfe 3, lass die Katze aufhören, Animal zu implementieren

package javaapplication3;

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

}

interface Animal{
    abstract boolean roar();
}

Das macht roar() nicht länger zu einem Vertrag für Dinge, die Tiere können müssen.

Abhilfe 3: Erweitern Sie eine Klasse, anstatt eine Schnittstelle zu implementieren

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

Das zu verwendende Mittel hängt davon ab, welches Modell das dargestellte Problem am besten darstellt. Der Fehler soll Sie dazu drängen, die “Programmierung durch Brownsche Bewegung” zu beenden.

Ihre Klasse implementiert eine Schnittstelle WiimoteListenerdie eine Methode hat onClassicControllerRemovedEvent. Die Methoden in Schnittstellen sind jedoch abstract, was bedeutet, dass es sich im Wesentlichen nur um Verträge ohne Implementierungen handelt. Sie müssen eines der Dinge hier tun:

  1. Implementieren Sie diese Methode und alle anderen Methoden, die diese Schnittstelle deklariert, die Ihre Klasse konkretisieren, oder
  2. Deklarieren Sie Ihre Klasse als abstrakt, damit sie nicht zum Instanziieren von Instanzen verwendet werden kann, sondern nur als Oberklasse verwendet wird.

  • Ok, danke, also werde ich es konkretisieren. In der Bibliothek, die ich verwende, woher weiß ich genau, wie diese Methode implementiert wird, habe ich Folgendes versucht: public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) { System.out.println (arg0); } aber es kann das Symbol nicht finden, muss ich in die JAR-Datei eintauchen, um die zu implementierende Klasse zu finden?

    – Phil

    15. Mai 2013 um 0:50 Uhr

  • Die Implementierung hängt von Ihren Zwecken ab, aber Ihre Implementierung sollte Fehler beseitigen. Welches Symbol wird nicht gefunden?

    – zw324

    15. Mai 2013 um 0:53 Uhr

  • ClassicControllerRemovedEvent

    – Phil

    15. Mai 2013 um 0:55 Uhr

  • Ok, also habe ich in die .jar-Datei getaucht und alle Methoden entfernt, die ich jemals deklarieren müsste, und es scheint in Ordnung zu sein. Bedeutet dies also, dass diese Klasse jetzt eine konkrete Klasse ist (ich gehe immer noch die Vererbung durch, da Sie vielleicht erraten haben, dass ich ein Lernender aus dieser Frage bin)

    – Phil

    15. Mai 2013 um 1:17 Uhr

  • Vielen Dank, die erste Option ist der Assistent

    – Alex

    28. Oktober 2020 um 18:59 Uhr

Wenn Sie eine Schnittstelle implementieren, müssen Sie alle Methoden in dieser Schnittstelle implementieren. Du hast es nicht umgesetzt onClassicControllerRemovedEvent.

Anscheinend WiimoteListener ist eine Schnittstelle, die eine definiert onClassicControllerRemovedEvent Methode. Ihre Klasse muss alle Methoden definieren, die eine Schnittstelle deklariert, oder sie wird nicht fehlerfrei kompiliert.

Es kann auch sein, dass diese Klasse mit einer anderen Version von entworfen wurde WiimoteListener Schnittstelle (basierend auf einer älteren oder neueren Version der JAR-Datei, die diese Schnittstelle enthält) und diese Version hat die oben erwähnte Methode nicht deklariert. Wenn dies der Fall ist, müssen Sie möglicherweise nur gegen die Version des JARs bauen, für die Ihre Klasse verwendet wurde.

Fehlende Parameter, inkonsistente Parametertypen, fehlende Methodendefinitionen, überprüfen Sie all dies.

In meinem Fall:

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

Dies wurde nicht kompiliert, da die Transportmethode einen der Parameter übersehen hat!

1014250cookie-checkDie Klasse ist nicht abstrakt und überschreibt Fehler in Java nicht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy