10

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

enter image description here

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.

2 Answers 2

11

Change your ConcreteUseCase as following:

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

For more information visit this link

Sign up to request clarification or add additional context in comments.

Comments

4

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 Eand 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.

3 Comments

Thanks for the insight. Loved your answer. I am going to use @JvmSuppressWildcards for now.
Nice alternative. Problem is, seems as if your fix forces the user to specify a mutable list, which may be undesired.
Not at all. Just used it to make clear what is going on. You can leave List as is, I added an example

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.