【问题标题】:Expressing "super" generics in Kotlin functional types?在 Kotlin 函数类型中表达“超级”泛型?
【发布时间】:2016-07-29 19:19:01
【问题描述】:

我正在尝试移植 RxJava 库并利用 Kotlin 中的扩展功能。

fun <T,R: MutableCollection<T>> Observable<T>.collectWhile(factory: (() -> R), condition: (R,T) -> Boolean) =
        compose(Transformers.collectWhile(factory,condition))

Transformers.collectWhile() 是用 Java 编写的,具有以下签名:

public static <T, R extends Collection<T>> Transformer<T, R> collectWhile(final Func0<R> factory,
            final Action2<? super R, ? super T> collect)

但是,我在映射 collect 参数时遇到了问题,而且我不擅长泛型。如何用函数类型表达super

更新

我犯了一个愚蠢的错误。我不应该在深夜发帖。

我实际上是针对这个

public static <T, R extends Iterable<?>> Transformer<T, R> collectWhile(final Func0<R> factory,
        final Action2<? super R, ? super T> collect, final Func2<? super R, ? super T, Boolean> condition)

这是我应该做的。

fun <T,R: MutableCollection<T>> Observable<T>.collectWhile(factory: (() -> R), action: (R,T) -> Unit, condition: (R,T) -> Boolean) =
    compose(Transformers.collectWhile(factory,action,condition))

【问题讨论】:

  • 请添加您收到的错误消息

标签: java generics rx-java kotlin rx-kotlin


【解决方案1】:

Java通配符类型? super T对应Kotlin中的in Tuse-site type projection,所以collect参数对应的类型为Action2&lt;in R, in T&gt;

该类型与 Kotlin 中的 (R, T) -&gt; Unit 函数类型大致等价(或者更具体地可以使用 SAM-conversion),因为 (R, T) -&gt; Unit 是类型 Function2&lt;R, T, Unit&gt; 的同义词,而后者等价于 Function2&lt;in R, in T, out Unit&gt; 由于到Function2类型参数的declaration-site variance

您不能将 (R, T) -&gt; Boolean 类型的函数作为参数传递给 collect,而 (R, T) -&gt; Unit 应该是其中的参数。

要么更改collect参数的类型,要么更改condition参数`的类型。

【讨论】:

  • 哦,伙计,现在我觉得自己很愚蠢。我做这件事的时候已经是深夜了。我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多