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

Xtend调用createResource函数报‘URI转URI’类型不匹配错误求助

在Xtend中创建磁盘文件对应的Resource变量时遇到类型不匹配错误

我想要在Xtend中生成一个指向磁盘文件的Resource变量,用于后续的foreach循环和compile函数。当前代码如下:

override doGenerate(Resource resource, ResourceSet input, IFileSystemAccess2 fsa, IGeneratorContext context) {

    allResources = input.resources.map(r|r.allContents.toIterable.filter(CmlProgram)).flatten
    
    this.fsa = fsa
    
    var BecomeRichestPath = "C:\\path\\to\\file";
    var file = new File(BecomeRichestPath).toURI()
    LOG.info("URI: " + file)
    var r = input.createResource(file) <---------- 错误位置

    for (p : resource.allContents.toIterable.filter(CmlProgram)) {
            
        if (!p.contracts.empty) {
            fsa.generateFile("/" + resource.URI.trimFileExtension.segmentsList.last + ".sol", p.compile)
            println("Count: " + p.eAllContents().size())
        }           
    }
}

调用createResource方法时编译报错:

Type mismatch: cannot convert from URI to URI during compilation.

我的导入列表如下:

import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.emf.ecore.resource.ResourceSet
import org.eclipse.xtext.EcoreUtil2
import org.eclipse.xtext.generator.IFileSystemAccess2
import org.eclipse.xtext.generator.IGeneratorContext

问题原因与解决方法

错误本质是类型不匹配:new File(BecomeRichestPath).toURI()生成的是Java标准库的java.net.URI,而EMF的ResourceSet.createResource()方法需要的是EMF框架自带的org.eclipse.emf.common.util.URI——这是两个完全独立的类,因此编译时会提示类型转换错误。

解决步骤:

  1. 导入EMF的URI类:
    import org.eclipse.emf.common.util.URI
    
  2. 替换原有的URI生成代码,直接用EMF URI的工具方法创建正确实例:
    var BecomeRichestPath = "C:\\path\\to\\file"
    // 直接创建EMF格式的文件URI
    var emfUri = URI.createFileURI(BecomeRichestPath)
    var r = input.createResource(emfUri)
    

这样就能正确创建指向磁盘文件的Resource变量,解决编译错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:12:47