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

如何在Xtext Inferrer中定义泛型类型引用?

在Xtext Inferrer中定义泛型方法类型引用

要实现类似private <T> T getFoo(Class<T> clazz)的泛型方法,在Xtext Inferrer中可以通过以下步骤完成,核心依赖ITypeReferenceOwner处理类型引用的创建与关联:

  • 创建泛型类型参数,并可按需添加类型边界
  • 构建泛型返回类型T
  • 生成参数所需的Class<T>泛型类型引用
  • 组装完整的泛型方法并设置可见性等属性

完整代码示例

// 假设你的Inferrer继承自AbstractDeclarativeInferrer
@Override
protected void inferInternal(YourModelElement element, IAcceptor<IEObjectDescription> acceptor) {
    // 获取当前上下文的类型引用所有者
    ITypeReferenceOwner typeOwner = typeReferenceOwnerProvider.getTypeReferenceOwner(element);
    
    // 1. 创建泛型类型参数<T>
    JvmTypeParameter tParam = typeOwner.newTypeParameter("T");
    // 可选:为T添加类型边界,比如限定实现Serializable接口
    // tParam.getConstraints().add(typeOwner.newTypeReference(Serializable.class));
    
    // 2. 构建方法返回类型T
    JvmTypeReference returnType = typeOwner.newTypeReference(tParam);
    
    // 3. 构建参数类型Class<T>
    JvmTypeReference classRawType = typeOwner.newTypeReference(Class.class);
    classRawType.getTypeArguments().add(typeOwner.newTypeReference(tParam));
    
    // 4. 创建方法参数
    JvmParameter clazzParam = typeOwner.newParameter("clazz", classRawType);
    
    // 5. 组装泛型方法
    JvmGenericMethod getFooMethod = typeOwner.newGenericMethod("getFoo", returnType);
    // 绑定泛型参数<T>到方法
    getFooMethod.getTypeParameters().add(tParam);
    // 添加方法参数
    getFooMethod.getParameters().add(clazzParam);
    // 设置方法可见性为private
    getFooMethod.setVisibility(JvmVisibility.PRIVATE);
    
    // 将方法关联到目标模型元素(示例中假设element是JvmClass类型,需根据你的模型调整)
    ((JvmClass) element).getMembers().add(getFooMethod);
}

关键说明

  • ITypeReferenceOwner负责管理类型引用的上下文,确保所有类型元素在同一作用域内有效
  • 如需多泛型参数,重复创建JvmTypeParameter并添加到method.getTypeParameters()即可
  • 类型边界通过JvmTypeParameter.getConstraints()添加,支持类继承或接口实现的限定

内容的提问来源于stack exchange,提问作者Florian Pirchner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:20:15