2016-02-29 77 views
0

我有以下階例如:訪問內部類方法在Java「細」的語法使用Scala的類&對象

class Nested {} 
object Nested { 
    class Inner {} 
    object Inner { 
    def x = 321 
    } 
} 

隨着JUnit測試特異性測試,我可以做Nested.Inner.x()並自由地調用該方法沒有Nested.Inner$.MODULE$.x()

import static junit.framework.Assert.*; 
    import org.junit.Test; 

    public class TestFromJava { 

    @Test 
    public void accessTest() { 
    assertEquals(321, Nested.Inner.x()); 
    } 
} 

這編譯,但在運行測試的那一刻,我得到(sbt test):

[error] TestFromJava.java:8: cannot find symbol 
[error] symbol: method x() 
[error] location: class Nested.Inner 
[error] Nested.Inner.x 

我如何從Scala語法中受益並且不使用可怕的$?也許這是該語言的一個功能,因爲它如何生成object實例。

+0

你所說的「這編譯」意思?這是你顯示的運行時錯誤嗎?看起來你正在使用sbt。你是否成功運行'sbt test:compile'?我認爲你幾乎需要通過'Nested.Inner $ .MODULE $ .x()'來訪問這個符號。' –

+0

編譯'sbt clean compile'的意義成功了。 –

+0

但是'TestFromJava'在哪裏,是主要來源還是測試來源?是在'src/main/java'還是'src/test/java'(假設你有一個構建 - 你能證實這一點?)。 'compile'不編譯測試源,它是'compile:compile'的縮寫。你需要運行'test:compile'。 –

回答

0

從Java調用時,您必須符合singleton object訪問權限,如explained in this question

在你的情況,這將是

Nested.Inner$.MODULE$.x()