我在 Kotlin 中有一个方法,它返回一个通用列表的 Rx Observable:
public fun getObservable(): Observable<List<FooBar>> {
return Observable.just(theList)
}
因为 Kotlin 列表特征定义为 List<out T>
, Java 会看到返回类型为 Observable<List<? extends FooBar>>
.
有没有办法告诉 Kotlin 编译器 Java 应该将其视为 Observable<List<FooBar>>
?
http://kotlinlang.org/docs/reference/generics.html
更新以正确显示问题。
最佳答案
您可以使用 JvmWildcard
和 JvmSuppressWildcards
注释控制 Java 如何看待 Kotlin 泛型。它是在 Kotlin 1.0 Beta 4 中添加的(参见 announcement)。
此更改意味着您的代码已经更改为可以,并且不再生成通配符。因为新的默认设置是在很多情况下不使用它们,您可以使用注释将它们带回来或在不需要时将它们隐藏。
此更改的公告指出:
Java Wildcards
There were issues with how Kotlin translated variant types, e.g. whether a List should be List in Java or simply List. Subtleties details aside, we did the following:
- By default, we do not generate wildcards in return types and where they make no sense
- When a wildcard is needed, one can enforce its presence with a type annotation: List<@JvmWildcard String> is always List in Java
- When we need to get rid of a wildcards, we can use @JvmSuppressWildcards (this can be used on a type or any declaration that contains it)
Examples:
fun foo(l: List<String>) // in Java: List<String> (String is final)
fun foo(l: List<@JvmWildcard String>) // in Java: List<? extends String>
interface Open {}
fun bar(p: List<Open>) // in Java: List<? extends Open> (Open is not final)
@JvmSuppressWildcards
fun bar(p: List<Open>) // in Java: List<Open>
因此,如果您仍然遇到问题,请将此应用于您的问题:
@JvmSuppressWildcards
public fun getObservable(): Observable<List<FooBar>> {
return Observable.just(theList)
}
关于java - 如何使用 Kotlin 互操作强制泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28480666/