Замок Kotlin подстановочного знака в параметре обратного вызова списка

Ява:

public class JavaClass implements ModelController.Callback { @Override public void onModelsLoaded(@NonNull List<? extends Model> models) { doSomething(models); } private void doSomething(List<Model> models) { } } 

Котлин:

 class ModelController { var callback = WeakReference<Callback>(null) interface Callback { fun onModelsLoaded(models: List<Model>) } fun someFunction() { callback.get().onModelsLoaded(ArrayList<Model>()) } } interface Model { } 

Без ? extends Model в методе Java onModelsLoaded, переопределение не соответствует интерфейсу, сделанному в Kotlin. С его помощью я получаю следующую ошибку:

 doSomething(<java.util.List<com.yada.Model>) cannot be applied to (java.util.List<capture<? extends com.yada.Model>>) 

Почему требуется подстановочный знак и почему он не позволяет использовать его против метода без подстановочных знаков?

Проблема связана с вариантами коллекции Kotlin, и Java имеет только вариацию использования сайта, которая реализована с помощью подстановочных знаков (захват связан с подстановочными знаками, но не совсем сам синтаксис ? extends ... ).

Когда в Kotlin мы говорим, что List<Model> означает «список только для чтения Model или подтипы Model », когда мы говорим то же самое в Java, это означает «изменяемый список точно Model и ничего другого». Чтобы означать, что означает List<Model> Котлин List<Model> , в Java мы должны сказать List<? extends Model> List<? extends Model> , поэтому для переопределения для работы вам нужно добавить шаблон в код Java.

Теперь ваше doSomething написано на Java и говорит, что ему нужен «список точно Model », и когда вы даете ему «список Model или его подтипы», компилятор Java жалуется, потому что это может быть опасно: doSomething попробуйте сделать что-то, что не является законным для списка, скажем, ModelImpl , потому что он думает, что он работает над списком Model .

На данный момент (Kotlin Beat 2) у вас есть два варианта:

  • используйте MutableList<Model> в вашем коде Kotlin – это означает, что именно означает List<Model> Java List<Model> , или
  • define doSomething чтобы он doSomething List<? extends Model> List<? extends Model> , что и означает ваш текущий код Kotlin.

В следующем обновлении Kotlin мы добавим аннотацию к типам, чтобы облегчить несколько более сложное решение этой проблемы.

  • Android Studio 3.0 - Не удается найти метод «com.android.build.gradle.internal.variant.BaseVariantData.getOutputs () Ljava / util / List '
  • Могу ли я преобразовать строку в выражение шаблона или выражение лямбда в kotlin?
  • Kotlin: сделать функцию Java invable infix
  • Kotlin: Получение данных из Firebase
  • Можно ли использовать doReturn () и CALLS_REAL_METHODS с mockito-kotlin?
  • Как я могу разбить String на массив в Kotlin?
  • Объявление того же свойства в классе Child, что и в Parent
  • Определение размера для настраиваемого типа массива в Android Kotlin
  • Связать размер ObservableList в привязке к Android
  • Идиоматический способ чтения двоичного файла с Kotlin?
  • Общие типы и полиморфизм
  • Interesting Posts

    Преобразуйте MainActivity с помощью панели действий / панели инструментов и кнопки с плавающей точкой в ​​Anko

    Android – IllegalStateException: cursor.getString (idx) не должно быть null

    Gradle kotlin Неподдерживаемый метод Dependencies.getAtoms ()

    Приложение Android на Gradle: невозможно слить dex

    указать класс Kotlin как точку входа Main-Class в MANIFEST.MF?

    Kotlin NoClassDefFoundError с помощью метода spring @RequestMapping

    Были отчеты об обработке ошибок в кодеков

    Котлин – эквивалентность комбинации Свифта «если пусть + литье»

    Оператор «Когда» и «switch» оператора Java

    Коутин Котлин с возвращаемым значением

    Kotlin: исключить null из списка (или другого функционального преобразования)

    compileKotlin block in build.gradle file throws error "Не удалось найти метод compileKotlin () для аргументов "

    частный модификатор видимости и подпакеты

    Создать класс расширить AsyncTask без утечки контекстного объекта в Android Kotlin

    В чем разница между основной и регулярной функцией?

    Давайте будем гением компьютера.