具有相同名称和参数类别名称的函数(但参数类别不同)

时间:2019-06-07 19:02:33

标签: java overloading bukkit

我遇到了一个非常奇怪的问题,我什至不知道我是否可以这样做。

基本上我有两个函数,witch应该具有相同的名称,但是会得到具有相同名称的不同参数对象。

这是因为我想为游戏Minecraft编写一个插件,并且该插件应与BungeeCord Bukkit服务器兼容。

public static void sendMessage(org.bukkit.command.CommandSender p, String k, Object...i){
    //fancy stuff
}

public static void sendMessage(net.md_5.bungee.api.CommandSender p, String k, Object...i){
    //fancy stuff
}

如果该插件是由 Bukkit 服务器加载的,则该插件对net.md_5.bungee.api.CommandSender一无所知,因为这是 BungeeCord 服务器核心的一类。与org.bukkit.command.CommandSender相同, Bukkit 使用它,而 BungeeCore 则不使用。

即使是面团,我也可以使用IntellIJ编译代码,我对此表示怀疑,因为如果将其反编译,它看起来像这样:

import org.bukkit.command.CommandSender;

public static void sendMessage(CommandSender p, String k, Object...i){
    //fancy stuff
}

public static void sendMessage(net.md_5.bungee.api.CommandSender p, String k, Object...i){
    //fancy stuff
}

我的第一个问题是:我什至可以这样做,还是因为并非所有类都已加载,甚至是面团永远都无法访问,这会给出例外吗?

现在,如果第一个问题可以由Sure you can回答,那么为什么使用此sendMessage(函数编译Bukkit或BungeeCord插件会出现编译问题?

Bukkit: Bukkit compilation

蹦极: enter image description here

因为如果这样不起作用,我可以肯定的是,至少可以将未装入的类放入代码块中,因为该代码可以正常工作,甚至在不工作时也不会引发异常由使用org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer的服务器加载的文件虽然在导入文件中:

import org.bukkit.entity.Player;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;

public static int getPing(Player p) {
    String version = getVersion(instance.getServer());
    if (version.startsWith("v1_8")) {
        return ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
    } else if (version.startsWith("v1_9")) {
        return ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
    } else if (version.startsWith("v1_10")) {
        return ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
    } else if (version.startsWith("v1_11")) {
        return ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
    } else if (version.startsWith("v1_12")) {
        return ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)p).getHandle().playerConnection.player.ping;
    } else {
        return ((CraftPlayer)p).getHandle().playerConnection.player.ping;
    }
}

那么这真的是我根本无法做的事情吗?或者这是IntellIJ编译器的问题,如果可以的话,我该如何解决呢?

1 个答案:

答案 0 :(得分:0)

我对您的想法的尝试是在子类中调用方法。找不到类是一个参数可能是一个问题。当我访问类时(只是我的猜测),尝试加载参数以确定要使用的方法。

所以输出如下。

您访问的班级有:

public static void sendMessage(Object player, String k, Object...i){
    if(isBukkit())
        MyBukkitUtils.sendMessage(player, k, i);
    else
        MyBungeeUtils.sendMessage(player, k, i);
}

MyBukkitUtils:

public static void sendMessage(Object player, String k, Object...i){
    if(!(player instanceOf CommandSender))
        return;
    CommandSender p = (CommandSender) player;
    //fancy stuff
}

与MyBungeeUtils相同,仅与BunggeeCommandSender相同。

我不知道您的代码,但是如果您必须将所有内容分开,则可以只编写两个插件(一个用于spigot,一个用于橡皮筋),并在其中包含通用代码的地方都使用include库。 / p>