GraalJS中能否使用泛型类型?Fabric服务器调用泛型类报错
在GraalJS中使用Java泛型类型的解决方法
Java泛型采用编译期类型擦除机制,运行时不存在Foo<Bar>这种带泛型参数的类型标识,所以直接用Java.type("com.mojang.brigadier.Command<com.mojang.brigadier.ServerCommandSource>")肯定会提示类不存在。以下是具体解决步骤:
1. 加载原始泛型类
先获取不带泛型参数的原始类:
const Command = Java.type("com.mojang.brigadier.Command"); const ServerCommandSource = Java.type("com.mojang.brigadier.ServerCommandSource");
2. 实现泛型接口(核心场景)
如果要实现Command<ServerCommandSource>这类泛型接口,使用Java.extend直接实现接口方法即可,GraalJS会根据方法参数/返回值自动适配泛型类型:
// 实现Command<ServerCommandSource>接口 const MyCustomCommand = Java.extend(Command, { run: function(context) { // context会自动被识别为CommandContext<ServerCommandSource>类型 const source = context.getSource(); // 这里编写你的命令逻辑 return Command.SINGLE_SUCCESS; // 返回命令执行结果 } });
3. 调用泛型方法或处理泛型实例
如果是调用返回泛型类型的方法,直接接收实例即可,无需额外指定泛型参数——GraalJS会基于Java的类型信息自动处理:
// 假设存在一个返回Command<ServerCommandSource>的方法getBuiltInCommand() const builtInCommand = someCommandRegistry.getBuiltInCommand(); // 直接调用run方法,参数会自动匹配CommandContext<ServerCommandSource> builtInCommand.run(someContext);
反射场景下获取泛型类型(可选)
如果需要通过反射获取泛型的具体类型(比如某些依赖类型信息的框架),可以借助匿名内部类创建TypeToken(以Guava的TypeToken为例):
const TypeToken = Java.type("com.google.common.reflect.TypeToken"); // 通过匿名内部类捕获泛型类型 const commandGenericType = new TypeToken<Command<ServerCommandSource>>() {}; const actualType = commandGenericType.getType();
以上方案在Fabric 1.21服务器的onInitialise阶段完全适用,因为此时相关Java类已经完成加载。
内容的提问来源于stack exchange,提问作者MCBEmodder
相关产品推荐
相关产品推荐

