【问题标题】:How do I use the result of a Java function in Scala?如何在 Scala 中使用 Java 函数的结果?
【发布时间】:2013-07-17 03:52:17
【问题描述】:

我有一个 Java 函数,它返回一个由 Scala 函数构建的对象。 Java 函数是这样的

import frontEnd.Builder ;
import frontEnd.AST.DeclList ;

public class Parser { 
    Builder builder  ;
    public DeclList Start() {
        DeclList result=builder.declList() ;
        ...
        return result ; } }

其中AST 是一个特征,Builder 是一个扩展AST 的类,DeclList 是一个特征。 builder.declList 返回一个 builder.DeclList 类型的值。

(这看起来很复杂,但它都可以编译,我认为这是有道理的。如果有帮助,我很乐意更改它。特别是,我怀疑,如果我可以消除使用路径相关类型,下面的问题不会。)

到目前为止,一切都很好。问题是当我从 Scala 代码中调用 Parser.Start 时,结果的类型为 <none><notype>,具体取决于我选择相信的错误消息。这是调用 start 的 Scala 代码。

val p : Parser = new Parser( stream )
val builder = new frontEnd.Builder() ;
p.setBuilder( builder )
val dl : builder.DeclList = p.Start()

最后一行有错误信息

../src/tests/ParserTests.scala:19: error: type mismatch;
found   : <notype>
required: builder.DeclList
    val dl : builder.DeclList = p.Start()
                                       ^
one error found

【问题讨论】:

  • 试试val dl : frontend.AST.DeclList = p.Start()

标签: java scala


【解决方案1】:

问题是builder 包中没有名为DeclList 的类型。根据您的 java 类定义,该类型存在于 frontend.AST 包中。所以把最后一行改成

val dl : frontend.AST.DeclList = p.Start()

【讨论】:

  • 几乎做到了。请参阅下面的答案。
  • 你的答案在哪里?我看不到一个
  • 它现在就在那里。需要一段时间才能确保它正在运行和编译。还要注意builder不是包,它是Builder类的对象,它扩展了AST,其中包含DeclList,所以builder.DeclList实际上是一个类型。
【解决方案2】:

按照 Sri Harsha Chilakapati 的建议,我尝试了

val dl : frontend.AST.DeclList = p.Start()

但这是错误的,因为AST 没有伴随对象。所以我创建了一个并将构建器更改为使用(而不是扩展)AST。因此我没有更多的路径依赖类型。 (我实际上并不想让他们开始,所以没关系。)现在错误消息是

 found   : frontEnd.AST#DeclList
 required: frontEnd.AST.DeclList
    val dl : frontEnd.AST.DeclList = p.Start()
                                            ^

最后我把行改为

val dl : frontEnd.AST.DeclList = p.Start().asInstanceOf[frontEnd.AST.DeclList] ;

这个编译。跑了。

我之前曾尝试使用asInstanceOf,但这没有奏效,因为&lt;notype&gt; 没有asInstanceOf 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多