Как реализовать этот интерфейс Java в Котлине?

Поскольку у Котлина нет примитивов, как это можно реализовать?

public interface A { Object get(Integer i); Object get(int i); } 

Я не могу изменить код Java, поскольку это скомпилированный файл класса в библиотеке.

Если одной реализации, как и в ответе @ zsmb13 , недостаточно для вас, и вам нужны отдельные реализации для двух методов в Kotlin, тогда вы можете добавить промежуточный интерфейс, переопределяющий метод, принимающий Integer с параметром nullable:

 private interface IntermediateA : A { override fun get(i: Int?): Any } 

Внедряя этот интерфейс вместо оригинального A , компилятор Kotlin будет отличать два метода, позволяя их переопределить следующим образом:

 class C : IntermediateA { override fun get(i: Int) = "primitive" override fun get(i: Int?) = "boxed" } 

 val a: A = C() println(a.get(1)) // primitive println(a.get(1 as Int?)) // boxed 

Если у вас есть доступ к Java-коду, вы можете исправить это, добавив аннотацию обнуления к методу, принимающему тип boxed:

 Object get(@Nullable Integer i); 

Компилятор Kotlin понимает различные аннотации нулевой вероятности, вот список .

Реализация только одного метода, который принимает Int как его параметр, работает и может быть вызван либо из Kotlin, либо из Java.

 class B : A { override fun get(i: Int): Any { return "something" } } 

Если вы декомпилируете байт-код, вы увидите, что компилятор Kotlin достаточно умен, чтобы создать оба метода, причем один из них просто перенаправляется на реальную реализацию.

Декомпилированный пример байт-кода

Одна из возможных проблем заключается в том, что вы не можете заставить метод принимать Int? , и он выйдет из .intValue() с помощью NullPointerException в .intValue() если он вызывается из Java следующим образом:

 B b = new B(); Integer i = null; b.get(i); 

Я не уверен, есть ли способ решить этот случай использования.

Изменить: ответ на горячую клавишу содержит ответы на оставшиеся ответы.

В Котлине мы можем заявить:

primitive int as: Int

boxed int as: Int?

Ваш интерфейс можно упростить, чтобы:

 private interface ModifiedA : A { override fun get(i: Int?): Any } 

В Kotlin, если вы реализуете этот модифицированный интерфейс, Kotlin предоставит вам два метода для переопределения. Один для примитивного типа, а другой для типа в штучной упаковке.

 class ImplementationOfA : ModifiedA { override fun get(i: Int) override fun get(i: Int?) } 

Я пишу простую демонстрацию в java.

затем конвертируйте его в kotlin с плагинами kotlin в idea или Android Studio .

Intereting Posts
Kotlin: Как запустить методы обслуживания в контексте класса транзакций? Создание Kotlin нового Gluon для разработчиков Java Наследование класса данных Kotlin + метод копирования Kotlin Coroutines в службе Android Как получить делегированный экземпляр в Котлин? Как обратиться к анонимному внутреннему классу в Котлине? Чтение файла Kotlin, использование блока, не перехватывающего все исключения Как я могу построить SQL-запрос с динамическим именем столбца в пространственной постоянной библиотеке Кинжал 2: Невозможно найти сгенерированный класс в Intellij Idea (Kotlin) Связывание слушателя; Не удается найти сеттер Как избежать избыточной нулевой проверки (предупреждение FindBugs) в поле Котлин Панель «Призрачная» нижняя панель навигации, когда фрагмент загружается в домашней деятельности Kotlin: MyClass :: class.java vs this.javaClass Добавление Kotlin к существующим Java-проектам нарушает ошибки в сообщениях об ошибках Android Studio Как правильно настроить плагин Kotlin для Gradle?