Ошибка генерации Kotlin в Java

Учитывая следующие три класса котлина:

abstract class UseCase<T> {
    fun execute(action: Action<T>) {
    }
}

class ConcreteUseCase : UseCase<List<String>>()

class Action<T>

Я не могу скомпилировать следующие строки в java-коде:

ConcreteUseCase s = new ConcreteUseCase();
s.execute(new Action<List<String>>());//<<<<<<< compilation error

введите описание изображения здесь

Ошибка говорит:

SomeClass < java.util.List <? extends Тип → в классе нельзя применить к SomeClass < java.util.List < Тип →

Я все еще новичок в kotlin, и это может быть что-то очень маленькое, но я не могу понять это. Я буду признателен за любую помощь.

Ответ 1

Измените ConcreteUseCase следующим образом:

class ConcreteUseCase : UseCase<List<@JvmSuppressWildcards String>>()

Для получения дополнительной информации посетите ссылку

Ответ 2

Чтобы просто исправить код Java, не касаясь Kotlin:

public static void main(String[] args) {
    ConcreteUseCase s = new ConcreteUseCase();
    Action<List<? extends String>> listAction = new Action<>();
    s.execute(listAction);
}

В противном случае: List в Kotlin объявлен как interface List<out E>, то есть только производитель E и, следовательно, ваши методы тип параметра List<? extends T> имеет подстановочные знаки в Java (производитель extends, потребитель super). Вы можете использовать MutableList на стороне Котлина:

class ConcreteUseCase : 
    UseCase<MutableList<String>>

Этот вариант не использует модификаторы объявлений-объявлений (in/out), и вы сможете вызвать метод, как ожидалось.

Также возможно использовать @JvmSuppressWildcards, как описано здесь.