2016-02-29 5 views
0

У меня есть следующий SCALA пример:Метод доступа внутренний класс с «отлично» синтаксис в 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' (если у вас есть сборка sbt - можете ли вы это подтвердить?). 'compile' не скомпилирует тестовые источники, для компиляции компилируется. Вам нужно запустить 'test: compile'. –

ответ

0

Вы должны подписать singleton object доступ при звонках с Java, как explained in this question.

В вашем случае это будет

Nested.Inner$.MODULE$.x()