2017-06-22 6 views
1

Nun, ich versuche, eine Java-Plugin für Bukkit/Spigot zu kompilieren, aber ich bin immer folgende Fehlermeldung:Fehler: Klasse nicht abstrakt ist und überschreiben nicht abstrakte Methode

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project Websend: Compilation failure 
[ERROR] /home/bruno/spigot/Websend/src/main/java/com/github/websend/WebsendPlayerCommandSender.java:[24,7] error: WebsendPlayerCommandSender is not abstract and does not override abstract method sendTitle(String,String,int,int,int) in Player 

Die jeweiligen Teile der Datei, wo der Fehler ist (ich meine):

public class WebsendPlayerCommandSender implements Player { 
/* This class allows tapping into command output from plugins 
* if the output is sent through the commandsender. 
* Note to anyone having compilation problems: Compile against Bukkit, not CraftBukkit. 
* 
* Tap this method(1.6.4): sendRawMessage, sendMessage(String), sendMessage(String[]) 
*/ 

    private final Player baseObject; 
    private final Plugin commandTargetPlugin; 

    public WebsendPlayerCommandSender(Player baseObject, Plugin commandTargetPlugin) { 
     this.baseObject = baseObject; 
     this.commandTargetPlugin = commandTargetPlugin; 
} 

    @Override 
    public void sendMessage(java.lang.String param0) { 
     PluginOutputManager.handleLogRecord(commandTargetPlugin, new LogRecord(Level.INFO, param0)); 
     baseObject.sendMessage(param0); 
    } 

    @Override 
    public void sendMessage(java.lang.String[] param0) { 
     for (String str : param0) { 
      PluginOutputManager.handleLogRecord(commandTargetPlugin, new LogRecord(Level.INFO, str)); 
     } 
     baseObject.sendMessage(param0); 
    } 

    @Override 
    public void sendRawMessage(java.lang.String param0) { 
     PluginOutputManager.handleLogRecord(commandTargetPlugin, new LogRecord(Level.INFO, param0)); 
     baseObject.sendRawMessage(param0); 
    } 

Und:

public void sendTitle(String string, String string1) { 
    baseObject.sendTitle(string, string1); 
} 

das Plugin ins't mir, aber ich brauche, um com Stapel mit der richtigen Version des Zapfens. Das Problem ist, dass ich nicht viel über Java weiß, um diesen Fehler zu lösen. Kann mir jemand helfen?

+0

Das glaube ich nicht, dass Sie Ihre Tipps Spieler ... – Kerooker

Antwort

4

Wenn Sie das Konzept verstehen wollen, dann lesen Sie die ganze Antwort sonst bis zum Ende gehen und den Block Angebot für die Lösung zu lesen.

Eine Schnittstelle in Java, wie der Name schon sagt, ist nur eine Schnittstelle. Wenn wir speziell in Javas Perspektive gehen. Interface sind Klassen mit deklarierten, aber nicht implementierten Funktionen. Wenn also eine andere Klasse diese Schnittstelle implementiert, muss diese Klasse alle Funktionen der Schnittstelle auch mit eigenen Funktionen implementieren.

Zum Beispiel

Dies ist eine Schnittstelle in Java

public interface Animal { 
    public void eat(); 
    public void travel(); 
} 

Dies ist eine Klasse ihrer Umsetzung ist

public class MammalInt implements Animal { 
    @Override 
    public void eat() { 
     System.out.println("Mammal eats"); 
    } 

    @Override 
    public void travel() { 
     System.out.println("Mammal travels"); 
    } 

    public int noOfLegs() { 
     return 0; 
    } 
} 

Die einzige Regel, die Sie sollten daran denken, wenn eine Klasse eine Schnittstelle implementieren hat um alle deklarierten Funktionen in der Schnittstelle zu implementieren.

In your code you have already implemented sendMessage and sendRawMessage . Now to remove the error you only have to implement 'sendTitle' as shown in the error.

+1

Ich denke, dass ich das eine Sekunde vor Ihrer Nachricht verstanden habe. Nach den Tipps von Malphrush konnte ich sehen, dass ich viele Dinge umsetzen musste, genau wie du es mir erzählt hast. :) Danke, ich denke, bald wird es funktionieren. – bbruno5

2

Player ist eine Schnittstelle, die definierte, aber nicht implementierte Methoden enthält. Wenn

Es ist im Grunde eine Unterzeichnung eines Vertrages sagen, dass es diese Methoden implementieren wird, die Player nicht. WebsendPlayerCommandSender scheint die Methoden sendMessage und sendRawMessage in Player bereits überschrieben zu haben. Allerdings gibt es ein Verfahren innerhalb Spieler senden Titel genannt, die

sendTitle(String string, String string1, int num1, int num2, int num3) 

Und WebsendPlayerCommandSender hat nicht überschrieben diese Methode sieht wie folgt aus. So werden Sie so etwas zu schaffen haben:

@Override 
public void sendTitle(String string, String string1, int num1, int num2, int num3){ 
    //Define behavior here 
} 
+0

Nach der Umsetzung werden soll, wird der Fehler auf diese geändert: 'Fehler: WebsendPlayerCommandSender nicht abstrakt ist und überschreibt nicht abstrakte Methode sendTitle (String, String) in Player' – bbruno5

+0

Es ist das gleiche wie vorher. Sie müssen die Methode sendTitle (String string1, String string2) überschreiben. Versuchen Sie, @Override über die Methode zu platzieren, wenn sie sich in der WebsendPlayerCommandSender-Klasse befindet, aber Sie erhalten immer noch den Fehler. – Malphrush

+0

Korrigieren, erstellen Sie eine neue Methode mit @Override, ändern Sie stattdessen die vorhandene, und das Aussehen, wie es funktioniert sehr gut funktioniert. Jetzt habe ich andere Fehler von anderen Methoden zu lösen. – bbruno5

Verwandte Themen