0

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

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

到目前为止,一切都很好。问题是当我Parser.Start从 Scala 代码调用时,结果具有类型<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
4

2 回答 2

1

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

val dl : frontend.AST.DeclList = p.Start()
于 2013-07-17T03:59:00.057 回答
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方法。

于 2013-07-17T04:46:44.110 回答