2017-01-25 14 views
5

Mam kod Kotlin podobnie jak poniżej, SingleKotlin.instance może być wywołana przez inne pliki KotlinKotlin: Java nie może rozwiązać symbolu Kotlin?

class SingleKotlin private constructor(){ 
    companion object { 
     val instance by lazy { 
      SingleKotlin() 
     } 
    } 

} 

Jednak gdy próbuję zadzwonić SingleKotlin.instance z java, to pokazuje nie można rozwiązać symbol „wystąpienie”

Nie rozumiem, dlaczego ktokolwiek może wyrzucić i jak mogę rozwiązać ten problem?

Odpowiedz

4

Wystarczy dodać @JvmStatic adnotacji nad polem (jak powiedział w niniejszej dokumentacji https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#static-fields)

więc kod powinien wyglądać następująco:

class SingleKotlin private constructor(){ 
    companion object { 
     @JvmStatic 
     val instance by lazy { 
      SingleKotlin() 
     } 
    } 
} 

I teraz można nazwać jak

SingleKotlin.instance 
+0

Thanks dla Yurii Kyrylchuk odpowiedź, po dodaniu @ JvmField, w kodzie java, muszę użyć "SingleKotlin.getInstance()" – user3239558

+1

'@ JvmField' nie może być stosowane do delegowanej własności, jednak '@ JvmStatic' może. To spowodowałoby, że pochłaniacz tej własności byłby eksponowany w zakresie statycznym klasy zawierającej, więc musisz wywołać ten getter jako 'SingleKotlin.getInstance()' – Ilya

+1

Niestety, popełniłem błąd, po dodaniu @ JvmStatic używam SingleKotlin. uzyskac instancje()" – user3239558

3

Oprócz odpowiedzi @YuriiKyrylchuk: inną opcją (i jedyną opcją, jeśli nie masz kontroli nad kodem Kotlina) jest odwołanie do MyClass.Companion z Java. Przykład:

class MyClass { 
    companion object { 
     val x: Int = 0 
    } 
} 

I w Javie:

MyClass.Companion.getX(); 
3

Jeśli obiekt SingleKotlin ma jeden prywatny konstruktor bez parametrów, można użyć object zamiast:

object SingleKotlin { 
    // some members of SingleKotlin 
    val x = 42 
} 

Następnie w Javie można odwołać przez pole statyczne INSTANCE:

SingleKotlin single = SingleKotlin.INSTANCE; 
// or 
SingleKotlin.INSTANCE.getX(); 
0

Trzeba wywołać metodę z Java tak:
AppUIUtils.Companion.yourMethod()

0

W dodatkowy do Ilya odpowiedź można użyć @JvmStatic Adnotacja

object SingleKotlin { 
    // some members of SingleKotlin 

    @JvmStatic val x = 42 
} 

Następnie w Javie

SingleKotlin.getX();