2013-07-17 44 views
0

我有一個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是擴展ASTDeclList是一個特徵的一類。 builder.declList返回builder.DeclList類型的值。 (這看起來很複雜,但都是編譯的,我認爲它是有道理的,如果有幫助,我很樂意改變它,特別是我懷疑,如果我可以不使用路徑依賴類型,下面的問題不會)。

到目前爲止,這麼好。問題是當我從Scala代碼調用Parser.Start時,結果的類型爲<none><notype>,具體取決於我選擇相信哪個錯誤消息。這是調用開始的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 
+1

嘗試 'val dl:frontend.AST.DeclList = p.Start()' –

回答

0

繼斯里蘭卡戒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方法。

1

的錯誤消息的問題是不存在類型在包builder命名DeclList。根據您的java類定義,該類型存在於frontend.AST包中。所以最後一行改爲

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

差不多這樣做了。請參閱下面的答案。 –

+0

你的答案在哪裏?我看不到一個 –

+0

它現在在那裏。花了一段時間才確定它正在運行以及編譯。還要注意'builder'不是一個包,它是'Builder'類的一個對象,它擴展了'AST',它包含'DeclList',所以'builder.DeclList'實際上是一個類型。 –

相關問題