Intereting Posts
Что такое поле для подбора Котлина? Повторный набор API-вызовов: как убедиться, что после вызова api значение не равно нулю? Добавить функцию расширений в класс Math в kotlin Lazy переменная с сбросом Как получить текущую локальную дату и время в Котлин compileKotlin block in build.gradle file throws error "Не удалось найти метод compileKotlin () для аргументов " Что означает код «val jsonObj = json as JsonObject» в Котлине? Наследование метода Init Как сигнализировать Observable для получения большего количества данных после использования Kotlin, мой проект случится, что java.lang.NoClassDefFoundError Ошибка: не удается получить доступ к файлу класса KObject для kotlin.jvm.internal.KObject не найден java.lang.VerifyError при написании Android-тестов с характеристиками в Котлине В Kotlin, как передать параметр, чтобы асинхронная область сохранила его? Контекстная проблема при использовании Anko DSL в настраиваемом адаптере для ListView NoClassDefFoundError для класса Kotlin в тесте JUnit во время выполнения

Статический импорт методов Kotlin Companion?

ТЛ: д-р; Можно ли import метод внутри объекта-компаньона другого класса без указания импорта с помощью Companion ? То есть, есть ли какой-либо возможный способ, который я могу сказать, import Bar.toFoo вместо import Bar.Companion.toFoo , если toFoo – это метод на сопутствующем объекте Bar ?


Мы переносим класс из Java в Kotlin. Наш класс выглядит так:

 class Bar { static Foo toFoo() { return new Foo(); } } 

И затем, чтобы использовать его, из класса, который является Котлином, мы говорим что-то вроде:

 import Bar.toFoo; // ... Bar().convert(toFoo()); // like a Java 8 Collector // ... 

Когда мы конвертируем Bar в Kotlin, это выглядит так:

 class Bar { companion object { @JvmStatic fun toFoo() = Foo() } } 

Мы бы хотели, чтобы вызывающий код работал без изменений, однако

 import Bar.toFoo 

больше не работает, даже с @JvmStatic! Вместо этого мы должны обновить его до

 import Bar.Companion.toFoo 

которые нам не нужно делать – мы хотим переключить класс Bar на Kotlin без обновления вызывающих абонентов.

Мысли? Мы используем Kotlin 1.1.2-2.

В отличие от Java, Kotlin не позволяет вызывать статические члены через ссылку на экземпляр. Java отправляет эти члены на основе объявления времени компиляции, поэтому в

 class Bar { static Foo toFoo() { return new Foo(); } } class Foo extends Bar { static Foo toFoo() { return new Foo(); } } class Baz { void test() { Bar fooAsBar = new Foo(); Foo foo = fooAsBar.toFoo(); } } 

В Java fooAsBar.toFoo() самом деле вызовет Bar.toFoo() (объявленный тип), а не Foo.toFoo() (тип времени выполнения). Это источник непонимания, а не хорошая практика программирования, поэтому Котлин не поддерживает ее.

Однако вы можете определить функцию расширения на панели:

 fun Bar?.toFoo() = Bar.toFoo() 

Затем вы можете позвонить

 val foo = fooAsBar.toFoo()