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
编写一个插件,该插件应该与BungeeCord和Bukkit服务器兼容
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是否使用自己的类加载程序。反编译并不意味着什么,而是由用户指定反编译的内容和位置