Класс не является абстрактным и не отменяет ошибку в Java

Я получаю ошибку времени компиляции с Java:

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

Вот class:

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

Могу ли я лучше объяснить, что означает эта ошибка?

В вашем classе реализован интерфейс WiimoteListener , который имеет метод onClassicControllerRemovedEvent . Однако методы в интерфейсах являются abstract , что означает, что они по сути являются контрактами без реализаций. Вы должны сделать одно из вещей здесь:

  1. Внедрите этот метод и все другие методы, объявляемые этим интерфейсом, которые делают ваш class конкретным, или
  2. Объявите абстрактный class, поэтому его нельзя использовать для создания экземпляров экземпляра, который используется только как суперclass.

Когда вы реализуете интерфейс, вы должны реализовать все методы в этом интерфейсе. Вы не реализовали onClassicControllerRemovedEvent .

Как воспроизвести эту ошибку как можно проще:

Код 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. Вы создали class Cat, который реализует интерфейс Animal.
  2. У вашего интерфейса под названием Animal есть абстрактный метод, называемый рев, который должен быть переопределен.
  3. Вы не обеспечили рев метода. Существует множество способов устранения ошибки времени компиляции.

Устранение 1, если Cat переопределяет ребро метода реферата ()

 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, у кошки прекратить реализацию Animal

 package javaapplication3; public class JavaApplication3 { public static void main(String[] args) { Cat c = new Cat(); } } class Cat{ } interface Animal{ abstract boolean roar(); } 

Что делает рев () больше не контрактом на то, что животные должны знать, как это сделать.

Устранение 3, расширение classа, а не реализация интерфейса

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

Средство от использования зависит от того, какая лучшая модель представляет представляемую проблему. Ошибка заключается в том, чтобы убедить вас прекратить «программирование с помощью коричневого движения».

Похоже, что WiimoteListener – это интерфейс, который определяет метод onClassicControllerRemovedEvent . Ваш class должен определять все методы, объявляемые интерфейсом, или они не будут компилироваться без ошибок.

Также может быть, что этот class был разработан с использованием другой версии интерфейса WiimoteListener (на основе старой или более новой версии jar, которая включает этот интерфейс), и эта версия не объявила вышеупомянутый метод. Если это так, это может потребовать только строения против версии банки, которую ваш class должен был использовать.

Давайте будем гением компьютера.