Given the following three kotlin classes:
abstract class UseCase<T> {
fun execute(action: Action<T>) {
}
}
class ConcreteUseCase : UseCase<List<String>>()
class Action<T>
I am unable to compile following lines in java code:
ConcreteUseCase s = new ConcreteUseCase();
s.execute(new Action<List<String>>());//<<<<<<< compilation error
Error says:
SomeClass<java.util.List<? extends Type>> in Class cannot be applied to SomeClass<java.util.List<Type>>
I am still new to kotlin and this might be something very small but I can't seem to figure it out. I will appreciate any help.
Change your ConcreteUseCase
as following:
class ConcreteUseCase : UseCase<List<@JvmSuppressWildcards String>>()
For more information visit this link
To simply fix the Java code without touching Kotlin:
public static void main(String[] args) {
ConcreteUseCase s = new ConcreteUseCase();
Action<List<? extends String>> listAction = new Action<>();
s.execute(listAction);
}
Otherwise: The List
in Kotlin is declared as interface List<out E>
, i.e. only a producer of E
and thus your method’s parameter type List<? extends T>
has wildcards in Java (Producer extends
, Consumer super
). You can use MutableList
on Kotlin side:
class ConcreteUseCase :
UseCase<MutableList<String>>
This one does not use declaration-site variance modifiers (in
/out
) and you’ll be able to call the method as expected.
It’s also possible to use @JvmSuppressWildcards
as explained here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With