2016-06-30 24 views
11

Converto una delle mie classi Java in Kotlin e la classe come di seguito.Come accedere all'oggetto compagno Kotlin in Java?

class MainApplication : Application() { 
    companion object { 
     operator fun get(context: Context): MainApplication { 
      return context.applicationContext as MainApplication 
     } 
    } 
} 

Ha una funzione statica get.

Ho ancora una funzione Java che lo accede.

MainApplication application = MainApplication.get(mContext); 

Era buono quando MainApplication è in Java. Ma non quando principale dell'applicazione in Kotlin, l'errore di codice di cui sopra

Error:(27, 54) error: cannot find symbol method get(Context) 

Come ho potuto accedere get nel mio codice Java di cui sopra?

risposta

15

È possibile aggiungere annotazioni @JvmStatic al metodo in oggetto associato per fare Kotlin generare un metodo statico.

class MainApplication : Application() { 
    companion object { 
     @JvmStatic fun get(context: Context): MainApplication { 
      return context.applicationContext as MainApplication 
     } 
    } 
} 

quindi è possibile accedervi da Java come prima della conversione in Kotlin:

MainApplication application = MainApplication.get(mContext); 

EDIT: mi sento in dovere di aggiungere qualcosa che ho imparato di recente: @JvmStatic in realtà non mossa in cui il metodo viene generato. È duplicato, generando un metodo statico per Java oltre al metodo sull'oggetto associato. Personalmente penso che questo non sia eccezionale e può avere delle implicazioni a seconda del caso d'uso, quindi qualcosa che vale la pena conoscere.

+0

Bello. Sembra che ci siano due modi. Dipende da quale lato (kotlin o java) potremmo cambiare. – Elye

+0

Spuntalo come 'la' risposta, dato che è più probabile che uno debba rendere Kotlin compatibile con Java piuttosto che viceversa. (cioè persone che probabilmente convertono da Java a Kotlin e lavorano sul codice Kotlin invece che sul codice Java). – Elye

+1

L'altra risposta (la mia) vale a dire l'utilizzo di 'MainApplication.Companion.get (mContext);' è anche una buona risposta :) – Elye

9

Ops, ho capito. Basta usare il sotto.

MainApplication application = MainApplication.Companion.get(mContext); 
+0

È inoltre possibile assegnare un nome all'oggetto complementare se non si desidera il nome predefinito 'Companion'. –

0

Omettendo il nome dell'oggetto associato, è necessario utilizzare il nome Companion per accedere ai metodi.

Esempio:

class MyClass1 { 
    companion object Object1 { 
     fun method1 { 
     } 
    } 
} 

class MyClass2 { 
    companion object { 
     fun method2 { 
     } 
    } 
} 

per richiamare il primo metodo compagno di oggetto si dovrebbe fare quanto segue:

MyClass1.method1() 

per richiamare il secondo:

MyClass2.Companion.method2() 

Vedi la documentazione Kotlin su Companion Objects per i dettagli.

+0

A partire da Kotlin 1.1.50 è possibile chiamare le funzioni dell'oggetto companion omettendo la parola chiave 'companion' – Xkill01

+0

non se si sta chiamando l'oggetto associato da Java e non ha un nome. – Mike

Problemi correlati