gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:08 26 4
gpt4 key购买 nike

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

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

这是因为我想为游戏 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 使用.

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

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
}

我的第一个问题是:我什至可以这样做吗?或者这会产生异常,因为并非所有类都已加载,即使它永远不会被访问?

现在,如果第一个问题可以通过 当然可以 来回答,那么为什么使用此 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 编译器的问题?如果是这样,我该如何修复它?

最佳答案

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

因此输出将类似于以下内容。

在您访问的类(class)中有:

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。

我不知道你的代码,但如果你必须将所有内容分开,你可以只编写两个插件(一个用于插头,一个用于蹦极),并在放置公共(public)代码的两个插件中使用包含库。

关于java - 具有相同名称和参数类名称的函数(但参数类不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56499940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com