2016-02-29 45 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()