2013-05-15 11 views
7

Otrzymuję błąd czasu kompilacji z Java:Klasa nie jest abstrakcyjna i nie Przestawianie błąd w Javie

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

Oto klasa:

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

mogę uzyskać lepsze wyjaśnienie co ten błąd oznacza?

Odpowiedz

3

Po zaimplementowaniu interfejsu należy wdrożyć wszystkie metody w tym interfejsie. Nie wdrożyłeś onClassicControllerRemovedEvent.

7

Twoja klasa implementuje interfejs WiimoteListener, który ma metodę onClassicControllerRemovedEvent. Jednak metody w interfejsach są abstract, co oznacza, że ​​są to zasadniczo tylko umowy bez żadnych implementacji. Trzeba zrobić jedną z tych rzeczy tutaj:

  1. wdrożyć tę metodę i wszystkie inne metody, które ten interfejs deklaruje, które sprawiają swoją betonu klasy lub
  2. zadeklarować klasy abstrakcyjne, więc nie mogą być wykorzystywane do instancję instancji, używaną tylko jako nadklasa.
+0

Ok, dziękuję, tak zrobię to beton, W bibliotece, że używam, skąd mam wiedzieć, excactly jak implemet tej metody, próbowałem następujące: public void onClassicControllerRemovedEvent (ClassicControllerRemovedEvent arg0) { System.out.println (arg0); } ale nie może znaleźć symbolu, czy muszę zagłębić się w .jar, aby znaleźć klasę do wdrożenia ?? – Phil

+0

Implementacja zależy od twoich celów, ale twoja implementacja powinna pozbyć się błędów. Jakiego symbolu nie można znaleźć? –

+0

ClassicControllerRemovedEvent – Phil

2

Wygląda na to, że WiimoteListener to interfejs definiujący metodę onClassicControllerRemovedEvent. Twoja klasa musi definiować wszystkie metody deklarowane przez interfejs lub nie będzie kompilować bez błędów.

Może się również zdarzyć, że ta klasa została zaprojektowana przy użyciu innej wersji interfejsu WiimoteListener (w oparciu o starszą lub nowszą wersję słoika zawierającego ten interfejs) i ta wersja nie zadeklarowała wyżej wymienionej metody. Jeśli tak, może po prostu wymagać zbudowania w oparciu o wersję słoika, z którego została wykonana.

3

Jak odtworzyć ten błąd w najprostszy możliwy sposób: kod

Java:

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

} 

interface Animal{ 
    abstract boolean roar(); 
} 

Pokazuje to błąd czasu kompilacji:

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

Dlaczego nie to kompilacja?

Ponieważ:

  1. Utworzono klasę Kot, który implementuje interfejs zwierzęcia.
  2. Twój interfejs o nazwie Zwierzę ma abstrakcyjną metodę o nazwie ryk, którą należy nadpisać.
  3. Nie przewidziano ryk metody. Istnieje wiele sposobów na wyeliminowanie błędu czasu kompilacji.

Rozwiązanie 1, mają Cat przesłonić metody abstrakcyjne ryk()

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

Rozwiązanie 2, zmiana Cat być abstrakcyjny tak:

package javaapplication3; 

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

} 
interface Animal{ 
    abstract boolean roar(); 
} 

Czyli nie możesz już utworzyć instancji Cat.

Rozwiązanie 3, mają kot zatrzymać realizację zwierzę

package javaapplication3; 

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

} 

interface Animal{ 
    abstract boolean roar(); 
} 

co sprawia, że ​​ryk() nie jest już umowę na rzeczy, że zwierzęta muszą wiedzieć jak to zrobić.

Rozwiązanie 3, rozszerzyć klasę zamiast wdrażania interfejs

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

Remedium do wykorzystania zależy od tego, co jest najlepszym modelem do reprezentowania problem jest reprezentowana. Błąd polega na tym, abyś zaprzestał "programowania przez ruchy Browna".

Powiązane problemy