10

给定以下三个 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<? 类中的扩展类型>>不能应用于 SomeClass<java.util.List<Type>>

我还是 kotlin 的新手,这可能很小,但我似乎无法弄清楚。我将不胜感激。

4

2 回答 2

11

更改您ConcreteUseCase的如下:

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

欲了解更多信息,请访问此链接

于 2018-01-11T23:31:30.590 回答
4

在不接触 Kotlin 的情况下简单地修复 Java 代码:

public static void main(String[] args) {
    ConcreteUseCase s = new ConcreteUseCase();
    Action<List<? extends String>> listAction = new Action<>();
    s.execute(listAction);
}

否则:ListKotlin 中的 被声明为interface List<out E>,即只有一个生产者,E因此您的方法的参数类型List<? extends T>在 Java 中具有通配符(生产者extends、消费者super)。您可以MutableList在 Kotlin 方面使用:

class ConcreteUseCase : 
    UseCase<MutableList<String>>

这个不使用声明站点方差修饰符(in/ out),您将能够按预期调用该方法。

也可以按照此处@JvmSuppressWildcards的说明使用。

于 2018-01-11T23:18:41.230 回答