2016-06-30 3 views
11

Я конвертирую один из моих классов Java в Kotlin и класс, как показано ниже.Как получить доступ к сопутствующему объекту Kotlin в Java?

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

Он имеет статическую функцию get.

У меня все еще есть функция Java, доступ к которой.

MainApplication application = MainApplication.get(mContext); 

Было хорошо, когда MainApplication находится на Java. Но не тогда, когда MainApplication в Котлин, выше код ошибки

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

Как я мог получить доступ к get в моем Java коде выше?

ответ

15

Вы можете добавить @JvmStatic аннотацию к методу в объекте компаньона, чтобы Котлин генерировать статический метод.

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

, то вы можете получить к нему доступ из Java, как перед преобразованием в Котлин:

MainApplication application = MainApplication.get(mContext); 

EDIT: Я чувствую себя обязанным что-то добавить, я узнал в последнее время: @JvmStatic фактически не двигаться где метод генерируется. Он дублирует, создавая статический метод для Java в дополнение к методу на сопутствующем объекте. Лично я думаю, что это не здорово, и это может иметь некоторые последствия в зависимости от варианта использования, поэтому что-то стоит знать.

+0

Ницца. Похоже, есть два пути. Зависит от какой стороны (kotlin или java) мы могли бы изменить. – Elye

+0

Отметьте это как «ответ», учитывая, что более вероятно, что Kotlin совместим с Java, чем наоборот. (то есть люди, которые могут конвертировать из Java в Kotlin, и работать над кодом Kotlin вместо Java-кода). – Elye

+1

Другой ответ (мой), то есть с использованием 'MainApplication.Companion.get (mContext);' также является хорошим ответом :) – Elye

9

Ops, я понял. Просто используйте ниже.

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

Вы также можете назвать сопутствующий объект, если вам не нравится имя 'Companion' по умолчанию. –

0

Опуская имя вашего объекта-компаньона, для доступа к методам необходимо использовать имя Companion.

Пример:

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

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

Для вызова первого метода объекта компаньон вы могли бы сделать следующее:

MyClass1.method1() 

Для вызова второй:

MyClass2.Companion.method2() 

Смотрите документацию Котлин на Companion Objects для подробностей.

+0

Как и в случае с Kotlin 1.1.50, вы можете вызывать функции сопутствующего объекта, опуская ключевое слово 'companion' – Xkill01

+0

нет, если вы вызываете объект-компаньон с Java и у него нет имени. – Mike

Смежные вопросы