Kotlin Generics Ошибка в 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
> в Class не может быть применен к SomeClass >
Я все еще новичок в kotlin, и это может быть что-то очень маленькое, но я не могу понять это. Я буду признателен за любую помощь.
2 ответа
Измени свой 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
в Котлине объявлен как interface List<out E>
т.е. только производитель E
и, следовательно, тип параметра вашего метода List<? extends T>
имеет подстановочные знаки в Java (Производитель extends
Потребитель super
). Ты можешь использовать MutableList
на стороне Котлина:
class ConcreteUseCase :
UseCase<MutableList<String>>
Этот не использует модификаторы дисперсии сайта объявления (in
/ out
) и вы сможете вызывать метод, как и ожидалось.
Также возможно использовать @JvmSuppressWildcards
как объяснено здесь.