Java 中的 Kotlin 泛型错误
Kotlin Generics Error in Java
给定以下三个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<? extends Type>> in Class cannot be applied to SomeClass<java.util.List<Type>>
我对 kotlin 还是个新手,这可能是一个很小的问题,但我似乎无法弄清楚。我将不胜感激任何帮助。
在不接触 Kotlin 的情况下简单地修复 Java 代码:
public static void main(String[] args) {
ConcreteUseCase s = new ConcreteUseCase();
Action<List<? extends String>> listAction = new Action<>();
s.execute(listAction);
}
否则:Kotlin 中的 List
被声明为 interface List<out E>
,即只有 E
的生产者,因此您的方法的参数类型 List<? extends T>
在 Java(生产者 extends
,消费者 super
)。您可以在 Kotlin 端使用 MutableList
:
class ConcreteUseCase :
UseCase<MutableList<String>>
此方法不使用 修饰符 (in
/out
),您将能够按预期调用该方法。
也可以使用 @JvmSuppressWildcards
解释 here。
按如下方式更改您的 ConcreteUseCase
:
class ConcreteUseCase : UseCase<List<@JvmSuppressWildcards String>>()
有关详细信息,请访问此 link
给定以下三个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<? extends Type>> in Class cannot be applied to SomeClass<java.util.List<Type>>
我对 kotlin 还是个新手,这可能是一个很小的问题,但我似乎无法弄清楚。我将不胜感激任何帮助。
在不接触 Kotlin 的情况下简单地修复 Java 代码:
public static void main(String[] args) {
ConcreteUseCase s = new ConcreteUseCase();
Action<List<? extends String>> listAction = new Action<>();
s.execute(listAction);
}
否则:Kotlin 中的 List
被声明为 interface List<out E>
,即只有 E
的生产者,因此您的方法的参数类型 List<? extends T>
在 Java(生产者 extends
,消费者 super
)。您可以在 Kotlin 端使用 MutableList
:
class ConcreteUseCase :
UseCase<MutableList<String>>
此方法不使用 in
/out
),您将能够按预期调用该方法。
也可以使用 @JvmSuppressWildcards
解释 here。
按如下方式更改您的 ConcreteUseCase
:
class ConcreteUseCase : UseCase<List<@JvmSuppressWildcards String>>()
有关详细信息,请访问此 link