Как заставить переменную выражения Kotlin отображаться как именованный интерфейс в Java? - PullRequest
0 голосов
/ 07 июня 2018

Я объявил «переменную выражения» (извините, я не уверен, как ее назвать) в классе Kotlin:

class Something {

    var onSelectionListener: (view: View, position: Int) -> Unit = {_, _ -> }

}

Так что я могу использовать лямбда-выражение для назначения выражения этой переменной.Он прекрасно работает при вызове этого класса из другого класса Kotlin.

something.onSelectionListener = { ... }

Но теперь я хочу позволить классу Java иметь возможность:

something.setOnSelectionListener(new Something.OnSelectionListener() {
            @Override
            public void onItemSelected(View view, int position) {
                //...
            }
        });

Это все о именование .Потому что это уже может сделать:

    something.setOnSelectionListener(new Function2<View, Integer, Unit>() {
        @Override
        public Unit invoke(View view, Integer integer) {
            //....
        }
    });

Но эти Function2, invoke и Unit плохи для читабельности.

Как я могу изменить эти сгенерированные имена (я ожидаю таммогут быть некоторые аннотации, которые могут достичь этого), сохраняя при этом эффект, что вызов из класса Kotlin все еще может использовать Lambda для назначения выражения вместо создания анонимного класса?

1 Ответ

0 голосов
/ 07 июня 2018

Function2 является частью сгенерированных Kotlin файлов, и вы ничего не можете оттуда изменить.

Таким образом, есть 2 способа справиться с этим:

  1. Используйте JDK 8 в своем приложении.И используя тот же код, который вы делаете, вы можете вызвать это в своем коде Java.

    s = Something();
    s.setOnSelectionListener((view, position) -> {
        ...
        return null;
    });
    
  2. Если вы не можете использовать JDK 8, и вам нужно использовать JDK 7,Лучший подход - создать анонимный класс или интерфейс.Кроме того, он по-прежнему прост и делает его более читабельным, пишете ли вы на Kotlin или Java.

Пример:

Something.kt

class Something {

    lateinit var onSelectionListener: OnSelectionListener

    interface OnSelectionListener {

        fun onItemSelected(view: View, position: Int)
    }
}

SomethingJava.java

s = new Something();
s.setOnSelectionListener(new Something.OnSelectionListener() {

        @Override
        public void onItemSelected(@NotNull View view, int position) {

        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...