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

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

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, и это может быть что-то очень маленькое, но я не могу понять это. Буду признателен за любую помощь.

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

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

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

    Чтобы просто исправить код 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> параметров вашего метода List<? extends T> List<? extends T> имеет подстановочные знаки в Java (Producer extends , Consumer super ). Вы можете использовать MutableList на стороне Котлина:

     class ConcreteUseCase : UseCase<MutableList<String>> 

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

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

    Intereting Posts