You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:30:57