我有一个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
答案 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
方法,因此无效。