Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有相同名称和参数类名称(但参数类不同)的函数_Java_Overloading_Bukkit - Fatal编程技术网

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

Java 具有相同名称和参数类名称(但参数类不同)的函数,java,overloading,bukkit,Java,Overloading,Bukkit,我遇到了一个非常奇怪的问题,我不知道我是否被允许这样做 基本上,我有两个函数,它们应该有相同的名称,但得到不同的参数对象,它们有相同的名称 这是因为我想为游戏Minecraft编写一个插件,该插件应该与BungeeCord和Bukkit服务器兼容 publicstaticvoidsendmessage(org.bukkit.command.CommandSender p,字符串k,Object…i){ //花哨的东西 } publicstaticvoidsendmessage(net.md_5.

我遇到了一个非常奇怪的问题,我不知道我是否被允许这样做

基本上,我有两个函数,它们应该有相同的名称,但得到不同的参数对象,它们有相同的名称

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

publicstaticvoidsendmessage(org.bukkit.command.CommandSender p,字符串k,Object…i){
//花哨的东西
}
publicstaticvoidsendmessage(net.md_5.bungee.api.CommandSender p,字符串k,Object…i){
//花哨的东西
}
如果插件是由bunkkit服务器加载的,那么插件对
net.md_5.bungee.api.CommandSender
一无所知,因为这是bunkeecord服务器核心的一个类,对于
org.Bukkit.command.CommandSender
来说也是如此,因为Bukkit使用它,而不是蹦极游戏

我用IntellIJ编译代码没有问题,即使我有点怀疑,因为如果反编译,它看起来是这样的:

import org.bukkit.command.CommandSender;
公共静态void sendMessage(CommandSender p、字符串k、对象…i){
//花哨的东西
}
publicstaticvoidsendmessage(net.md_5.bungee.api.CommandSender p,字符串k,Object…i){
//花哨的东西
}
我的第一个问题是:我甚至可以这样做,或者这会给异常,因为不是所有的类都被加载,即使它永远不会被访问

现在,如果第一个问题可以通过
来回答,当然可以
那么为什么使用这个
sendmages(
函数)编译一个Bukkit或bungeecard插件会出现编译问题

Bukkit:

蹦极绳:

因为如果这不起作用,我可以肯定的是,如果你将未加载的类放入你的代码块中,你至少可以处理这些类,因为这段代码工作得很好,并且在没有被使用
org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer的服务器加载时甚至不会引发异常,因为它在导入中:

import org.bukkit.entity.Player;
导入org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
公共静态int getPing(播放器p){
String version=getVersion(instance.getServer());
if(版本.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);
}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);
}else if(version.startsWith(“v1_12”)){
return((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)p);
}否则{
return((CraftPlayer)p.getHandle().playerConnection.player.ping;
}
}

那么这真的是我不能做的事情,还是这是IntellIJ编译器的问题?如果是的话,我该如何解决它?

好吧,我的想法是在子类中调用方法。这可能是一个问题,未找到的类是一个参数。当访问该类时(只是我的推测)尝试加载参数以确定使用哪种方法

所以像下面这样的东西将是输出

在您访问的类中:

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

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

我的BungeUtils也一样,只是BungeeCommandSender


我不知道你的代码,但是如果你必须把所有东西分开,你可以只编写两个插件(一个用于插口,一个用于蹦极)如果放置了公共代码,则在这两个类中都使用include a库。

我的想法是在子类中调用方法。未找到的类可能是一个参数。当访问该类时(只是我的推测),会尝试加载参数以确定使用哪个方法

所以像下面这样的东西将是输出

在您访问的类中:

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

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

我的BungeUtils也一样,只是BungeeCommandSender


我不知道你的代码,但是如果你必须把所有东西分开,你可以只编写两个插件(一个用于插口,一个用于蹦极)在这两个版本中都使用一个包含一个库的通用代码。

是的。如果反编译,Bukkt版本
1.10.2
中甚至没有一个文件夹
v1\u 13\u R2
。并且您确定其他模块不包含给定的CarftPlazyer类?可能作为存根?可能在库中?正常的类加载需要所有参考解压类,不确定Bukkit或Forge是否使用自己的类加载器。解压并不意味着什么,而是由用户指定解压的内容和位置。例如,如果解压,Bukkt版本
1.10.2
中甚至没有文件夹
v1\u 13\u R2
。您确定其他模块不包含给定的CarftPlazyer类?可能作为存根?可能在库中?正常的类加载需要所有引用的类,不确定Bukkit或Forge是否使用自己的类加载程序。反编译并不意味着什么,而是由用户指定反编译的内容和位置