Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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 如何构造公共模块,以便子模块能够从API中获得正确类型的对象?_Java_Gradle_Module_Structure - Fatal编程技术网

Java 如何构造公共模块,以便子模块能够从API中获得正确类型的对象?

Java 如何构造公共模块,以便子模块能够从API中获得正确类型的对象?,java,gradle,module,structure,Java,Gradle,Module,Structure,嘿,所以我有common模块,其中包含代码显示bellow和另外两个模块bungee和bukkit。我需要如何构造我的代码,以便在每个模块中使用common部分代码,而不必在ChildCommand中将Object转换为CommandSender,是否有办法在那里而不是Object获得正确的CommandSender 一些需要记住的事情: common模块没有依赖项。 蹦极模块使用蹦极绳API和通用模块作为依赖项。 bukkit模块使用bukkit API和common模块作为依赖项。 Bukk

嘿,所以我有
common
模块,其中包含代码显示bellow和另外两个模块
bungee
bukkit
。我需要如何构造我的代码,以便在每个模块中使用
common
部分代码,而不必在
ChildCommand
中将
Object
转换为
CommandSender
,是否有办法在那里而不是
Object
获得正确的
CommandSender

一些需要记住的事情:
common
模块没有依赖项。
蹦极
模块使用蹦极绳API和
通用
模块作为依赖项。
bukkit
模块使用bukkit API和
common
模块作为依赖项。
Bukkit和Bungeecord API都有自己的
CommandSender
类,但它们并不相同。
不能修改来自API的类

此类是
通用
模块的一部分。

public interface ChildCommand {
    
    void run(Object sender, String[] args);
    
    String getName();
    
}

public abstract class AbstractCommandService<S> {
    
    protected final Set<ChildCommand> childCommands;
    
    protected AbstractCommandService() {
        childCommands = new HashMap<>();
    }
    
    public boolean execute(Object sender, String commandName, String[] args) {
        for (ChildCommand childCommand : childCommands) {
            if (childCommand.getName().equalsIgnoreCase(commandName)) {
                childCommand.run(sender, args);
                return true;
            }
        }
        return false;
    }

    public void addCommand(ChildCommand command) {
        childCommands.add(command);
    }
    
}
public class BungeeReload implements ChildCommand {

    private final String NAME = "reload";

    public BungeeReload() {}

    @Override
    public String getName() {
        return NAME;
    }

    /*how do I structure my code so here I would get `net.md_5.bungee.api.CommandSender` 
    instead of `Object` for the sender parameter.*/
    @Override 
    public void run(Object sender, String[] args) {
        ((CommandSender)sender).sendMessage("Reload command has been ran on bungee.");
    }

}

public class BungeeCommandService extends AbstractCommandService<CommandSender> {}

public class MainBungeeCommand extends Command {

    private BungeeCommandService commandService;    
    
    public MainBungeeCommand() {
        super("cmd-name", "cmd-permission", "cmd-alias");
        commandService = new BungeeCommandService();

        commandService.addCommand(new BungeeReload());
    }

    @Override
    public void execute(CommandSender sender, String[] args) {
        if (args.length > 0) {
            String commandName = args[0];
           
            boolean successfullyExecuted = commandService.execute(sender, commandName, args);
            if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
        } 
    }
    
}
public class BukkitReload implements ChildCommand {

    private final String NAME = "reload";

    public BukkitReload () {}

    @Override
    public String getName() {
        return NAME;
    }

    /*how do I structure my code so here I would get `org.bukkit.command.CommandSender` 
    instead of `Object` for the sender parameter.*/
    @Override 
    public void run(Object sender, String[] args) {
        ((CommandSender)sender).sendMessage("Reload command has been ran on bukkit.");
    }

}

public class BukkitCommandService extends AbstractCommandService<CommandSender> {}

public class MainBukkitCommand implements CommandExecutor {

    private BukkitCommandService commandService;    
    
    public MainBukkitCommand() {
        commandService = new BukkitCommandService();
        commandService.addCommand(new BukkitReload());
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (args.length > 0) {
            String commandName = args[0];
           
            boolean successfullyExecuted = commandService.execute(sender, commandName, args);
            if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
            return true;
        }
        return false; 
    }
    
}
此类是
bukkit
模块的一部分。

public interface ChildCommand {
    
    void run(Object sender, String[] args);
    
    String getName();
    
}

public abstract class AbstractCommandService<S> {
    
    protected final Set<ChildCommand> childCommands;
    
    protected AbstractCommandService() {
        childCommands = new HashMap<>();
    }
    
    public boolean execute(Object sender, String commandName, String[] args) {
        for (ChildCommand childCommand : childCommands) {
            if (childCommand.getName().equalsIgnoreCase(commandName)) {
                childCommand.run(sender, args);
                return true;
            }
        }
        return false;
    }

    public void addCommand(ChildCommand command) {
        childCommands.add(command);
    }
    
}
public class BungeeReload implements ChildCommand {

    private final String NAME = "reload";

    public BungeeReload() {}

    @Override
    public String getName() {
        return NAME;
    }

    /*how do I structure my code so here I would get `net.md_5.bungee.api.CommandSender` 
    instead of `Object` for the sender parameter.*/
    @Override 
    public void run(Object sender, String[] args) {
        ((CommandSender)sender).sendMessage("Reload command has been ran on bungee.");
    }

}

public class BungeeCommandService extends AbstractCommandService<CommandSender> {}

public class MainBungeeCommand extends Command {

    private BungeeCommandService commandService;    
    
    public MainBungeeCommand() {
        super("cmd-name", "cmd-permission", "cmd-alias");
        commandService = new BungeeCommandService();

        commandService.addCommand(new BungeeReload());
    }

    @Override
    public void execute(CommandSender sender, String[] args) {
        if (args.length > 0) {
            String commandName = args[0];
           
            boolean successfullyExecuted = commandService.execute(sender, commandName, args);
            if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
        } 
    }
    
}
public class BukkitReload implements ChildCommand {

    private final String NAME = "reload";

    public BukkitReload () {}

    @Override
    public String getName() {
        return NAME;
    }

    /*how do I structure my code so here I would get `org.bukkit.command.CommandSender` 
    instead of `Object` for the sender parameter.*/
    @Override 
    public void run(Object sender, String[] args) {
        ((CommandSender)sender).sendMessage("Reload command has been ran on bukkit.");
    }

}

public class BukkitCommandService extends AbstractCommandService<CommandSender> {}

public class MainBukkitCommand implements CommandExecutor {

    private BukkitCommandService commandService;    
    
    public MainBukkitCommand() {
        commandService = new BukkitCommandService();
        commandService.addCommand(new BukkitReload());
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (args.length > 0) {
            String commandName = args[0];
           
            boolean successfullyExecuted = commandService.execute(sender, commandName, args);
            if (!successfullyExecuted) sender.sendMessage("Unknown command!"));
            return true;
        }
        return false; 
    }
    
}
公共类BukkitReload实现ChildCommand{
私有最终字符串NAME=“reload”;
公共BukkitReload(){}
@凌驾
公共字符串getName(){
返回名称;
}
/*我如何构造代码,以便在这里获得'org.bukkit.command.CommandSender'
而不是发送方参数的“Object”*/
@凌驾
公共无效运行(对象发送方,字符串[]args){
((CommandSender)sender.sendMessage(“重新加载命令已在bukkit上运行”);
}
}
公共类BukkitCommandService扩展了AbstractCommandService{}
公共类MainBukkitCommand实现CommandExecutor{
私人BukkitCommandService命令服务;
公共MainBukkitCommand(){
commandService=新的BukkitCommandService();
addCommand(新的BukkitReload());
}
@凌驾
公共布尔onCommand(CommandSender、Command cmd、字符串标签、字符串[]args){
如果(args.length>0){
String commandName=args[0];
布尔值successfullyExecuted=commandService.execute(发送方,commandName,args);
如果(!successfullyExecuted)sender.sendMessage(“未知命令”);
返回true;
}
返回false;
}
}
这里是API中的类。
来自BungeeCordAPI的类。
来自BungeeCordAPI的类。
从Bukkit API初始化。
从BukkitAPI中初始化