【问题标题】:Reactor Kotlin Generic type returnReactor Kotlin 通用类型返回
【发布时间】:2019-11-27 04:39:48
【问题描述】:

有没有人知道为什么泛型类型变成Nothing!,不能和Reactor onErrorReturn 链接?

fun test(): Mono<out String> {
        return Mono.just("")
    }
// Compile error
test().onErrorReturn("dummy")

类型不匹配 要求:什么都没有! 找到:字符串 投影类型 Mono 限制使用 public final fun onErrorReturn...

但是,如果我在另一个函数中使用 maponErrorReturn,它会起作用

// No error
fun useTest(): Mono<String> {
        return test().map { "haha" }
    }
useTest().onErrorReturn("hehe")

【问题讨论】:

    标签: generics kotlin project-reactor


    【解决方案1】:

    Mono&lt;out String&gt; 基本上意味着Mono&lt;some subtype of String&gt;。 IE。 "Mono&lt;String&gt;Mono&lt;Nothing&gt;";所以对于

    test().onErrorReturn(x)
    

    要编译,x 的类型必须有效,无论test() 返回Mono&lt;String&gt; 还是Mono&lt;Nothing&gt;。如果是Mono&lt;String&gt;x必须有String类型;如果是Mono&lt;Nothing&gt;,则必须是Nothing(这就是"dummy" 不进行类型检查的原因)。所以它必须是StringNothing 的子类型;这是Nothing

    编译器实际上并不认为这些是单独的情况,但结果是相同的。

    【讨论】:

    • 您能否详细说明“String 的每个子类型。这使得它成为Nothing”?
    • 谢谢,这确实解释了为什么它变成Nothing 因为Nothing,这是否意味着我不会在Kotlin 中使用带有out 的Mono?基本上,它在大多数 Mono 方法中都松散了类型信息。 Java中没有类是所有事物的子类型,这不会是Java的问题。
    • Mono&lt;out String&gt; 的 Java 等价物是 Mono&lt;? extends String&gt;,我希望它会遇到完全相同的问题(例如 .onErrorReturn("dummy") 也不应该工作;如果是这样,编译器可能会注意到 @ 987654348@ 是最终的并将其简化为Mono&lt;String&gt;)。如果你看这里projectreactor.io/docs/core/release/api/reactor/core/publisher/…,你会发现它从未用作返回类型,但它作为参数类型很有用。在 Kotlin 中也是如此。
    • 是的,你是对的,Java 也有同样的问题。那么如何返回某种类型的 Mono 可以是它的子类型呢?
    • 嗯,这你这样做的方式。问题只是你不能用它做很多事情,但是1.有一些你可以,你自己举个例子test().map { "haha" }; 2.你无法真正避免它。我认为最好的方法是将其转换为Mono&lt;String&gt;(在此示例中;test().map { it } 应该这样做)然后照常工作。
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多