Ответ 1
Измените ConcreteUseCase
следующим образом:
class ConcreteUseCase : UseCase<List<@JvmSuppressWildcards String>>()
Для получения дополнительной информации посетите ссылку
Учитывая следующие три класса котлина:
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>
имеет подстановочные знаки в Java (производитель extends
, потребитель super
). Вы можете использовать MutableList
на стороне Котлина:
class ConcreteUseCase :
UseCase<MutableList<String>>
Этот вариант не использует модификаторы объявлений-объявлений (in
/out
), и вы сможете вызвать метод, как ожидалось.
Также возможно использовать @JvmSuppressWildcards
, как описано здесь.