web-dev-qa-db-fra.com

La classe n'est pas abstraite et ne remplace pas l'erreur dans Java

Je reçois une erreur de temps de compilation avec Java:

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

Voici la classe:

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

Puis-je obtenir une meilleure explication de la signification de cette erreur?

12
Phil

Votre classe implémente une interface WiimoteListener, qui a une méthode onClassicControllerRemovedEvent. Cependant, les méthodes dans les interfaces sont abstract, ce qui signifie qu'il s'agit essentiellement de contrats sans implémentations. Vous devez faire l'une des choses ici:

  1. Implémentez cette méthode et toutes les autres méthodes déclarées par cette interface, qui rendent votre classe concrète, ou
  2. Déclarez votre résumé de classe, il ne peut donc pas être utilisé pour instancier des instances, uniquement utilisé comme superclasse.
10
zw324

Comment reproduire cette erreur aussi simplement que possible:

Code Java:

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

}

interface Animal{
    abstract boolean roar();
}

Affiche cette erreur de temps de compilation:

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

Pourquoi ne compile-t-il pas?

Car:

  1. Vous avez créé une classe Cat qui implémente une interface Animal.
  2. Votre interface appelée Animal a une méthode abstraite appelée rugissement qui doit être remplacée.
  3. Vous n'avez pas prévu de rugissement de méthode. Il existe de nombreuses façons d'éliminer l'erreur de compilation.

Remède 1, demandez à Cat de remplacer la méthode abstraite 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();
}

Remède 2, changez Cat pour être un résumé comme celui-ci:

package javaapplication3;

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

}
interface Animal{
    abstract boolean roar();
}

Ce qui signifie que vous ne pouvez plus instancier Cat.

Remède 3, demandez à chat d'arrêter de mettre en œuvre Animal

package javaapplication3;

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

}

interface Animal{
    abstract boolean roar();
}

Ce qui fait que rugissement () n'est plus un contrat pour des choses que les animaux doivent savoir faire.

Remède 3, étendre une classe plutôt que d'implémenter une interface

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

Le remède à utiliser dépend du meilleur modèle pour représenter le problème représenté. L'erreur est là pour vous inciter à arrêter la "programmation par mouvement brownien".

6
Eric Leschinski

Lorsque vous implémentez une interface, vous devez implémenter toutes les méthodes de cette interface. Vous n'avez pas implémenté onClassicControllerRemovedEvent.

3
Tips48

Il semble que WiimoteListener soit une interface qui définit une méthode onClassicControllerRemovedEvent. Votre classe doit définir toutes les méthodes déclarées par une interface sinon elle ne se compilera pas sans erreurs.

Il se peut également que cette classe ait été conçue à l'aide d'une version différente de l'interface WiimoteListener (basée sur une version plus ancienne ou plus récente du jar qui inclut cette interface) et que cette version n'ait pas déclaré la méthode mentionnée ci-dessus. Si tel est le cas, il peut simplement nécessiter de construire avec la version du pot que votre classe a été conçue pour utiliser.

2
Shadow Man

Paramètres manquants, types de paramètres incohérents, définitions de méthodes manquantes, vérifiez tout cela.

Dans mon cas:

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

Cela n'a pas été compilé car la méthode de transport a manqué l'un des paramètres!

0
JumpMan