java - 如何使用 Kotlin 互操作强制泛型类型

标签 java generics interop kotlin

我在 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

更新以正确显示问题。

最佳答案

您可以使用 JvmWildcardJvmSuppressWildcards 注释控制 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/

相关文章:

java - Apache POI : How to set font style for a field (PAGE, PAGENUM, PAGEREF...)

java - 西提 CEP : Multiple results per group when using time window

java - 通过数据结构(队列、堆栈、包)进行迭代

swift - 如何创建一个 UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>

java - 如何使用 replace(char, char) 将字符 b 的所有实例替换为空

java - 删除重复的项目 JComboBox

c# - Action<T> 还是 Action<in T>?

scala - 为什么我不能在 Scala 中创建 F 有界对象

c# Interop Word 文档添加样式

python - Python中如何区分不同类型的NaN float