如何在Scala中使用Java函数的结果?

时间:2013-07-17 03:52:17

标签: java scala

我有一个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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

按照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,但由于<notype>没有asInstanceOf方法,因此无效。