【问题标题】:error: Class is not abstract and does not override abstract method错误:类不是抽象的,不会覆盖抽象方法
【发布时间】:2017-06-22 18:12:22
【问题描述】:

好吧,我正在尝试为 Bukkit/Spigot 编译一个 java 插件,但我收到以下错误:

[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

文件的各个部分哪里有错误(我的意思是):

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

还有这个:

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

插件不是我的,但我需要使用正确版本的 spigot 进行编译。问题是我不太了解java来解决这个错误。谁能帮帮我?

【问题讨论】:

  • 我认为你不应该实现 Player...

标签: java plugins minecraft bukkit


【解决方案1】:

如果您想理解这个概念,请阅读整个答案,否则请到最后阅读解决方案的块引用。

java中的接口顾名思义就是一个接口。如果我们专门从java的角度来看。接口是具有已声明但未实现的功能的类。 因此,当其他类实现该接口时,该类必须实现接口的所有功能以及它自己的功能。

例如

这是java中的接口

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

这是一个实现它的类

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

当一个类实现一个接口时,你应该记住的唯一一条规则是,它必须实现接口中声明的所有函数。

在您的代码中,您已经实现了sendMessagesendRawMessage。现在要消除错误,您只需执行错误中所示的“sendTitle”。

【讨论】:

  • 我想在看到您的消息之前我已经理解了这一点。按照 Malphrush 的提示,我可以看到我必须实现很多事情,就像你告诉我的那样。 :) 谢谢,我想很快就会奏效。
【解决方案2】:

Player 是一个接口,其中包含已定义但未实现的方法。当

WebsendPlayerCommandSender implements Player

它基本上是在签署一份合同,说它将实现 Player 没有的这些方法。似乎 WebsendPlayerCommandSender 已经覆盖了 Player 中的 sendMessage 和 sendRawMessage 方法。但是,Player 中有一个名为 send Title 的方法,看起来像这样

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

而且 WebsendPlayerCommandSender 并没有覆盖这个方法。所以你必须创建这样的东西:

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

【讨论】:

  • 按照您的提示,错误更改为:error: WebsendPlayerCommandSender is not abstract and does not override abstract method sendTitle(String,String) in Player
  • 和以前一样。您需要覆盖 sendTitle(String string1, String string2) 方法。如果它在 WebsendPlayerCommandSender 类中,请尝试将 @Override 放在该方法上,但您仍然收到错误。
  • 更正,用@Override 创建一个新方法,而不是修改现有的,并保持这个,看起来工作得很好。现在我有其他错误需要解决。
  • 很高兴这个问题得到了解决。如果您的问题已得到解决,请为其中一个答案投票。在这个网站上被认为是礼貌的,而且当他们看到这个问题时,它会帮助和你有同样问题的用户:)
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
相关资源
最近更新 更多