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?
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:
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:
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".
Lorsque vous implémentez une interface, vous devez implémenter toutes les méthodes de cette interface. Vous n'avez pas implémenté onClassicControllerRemovedEvent
.
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.
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!