【问题标题】:Kotlin : Returning a default Generic Type for default interface functionKotlin:为默认接口函数返回默认通用类型
【发布时间】:2019-11-28 15:01:14
【问题描述】:

我在接口中定义了一个函数。此函数返回一个通用值。我希望这个值默认是CompletableFuture<Void>,因为在很多情况下这个run() 函数什么都不做。我想Java中的问题是一样的。

interface Command<out Payload, CommandResult> {

   fun run(): CompletableFuture<CommandResult>{
       return CompletableFuture.runAsync{}
   }
}

编译器说有一个类型不匹配

默认情况下,我们什么都不做,所以 CompleteableFuture&lt;Void&gt; 返回很好,runAsync() 完成这项工作。在某些情况下,run() 函数将返回 CompleteableFuture&lt;Car&gt;,例如

【问题讨论】:

  • 我没有关注这个 run() 函数的用途,因为你传递了 runAsync 一个空的可运行文件。您是否打算允许将 runnable 传递给此函数? runAsync 始终返回 CompleteableFuture&lt;Void&gt;,因此将返回类型指定为 CompletableFuture&lt;CommandResult&gt; 是没有意义的。
  • 我希望默认情况下,我们什么都不做,所以 Void 返回很好,runAsync() 可以完成这项工作。在某些情况下,run() 函数将返回一个 CompleteableFuture&lt;Car&gt; 例如

标签: generics kotlin


【解决方案1】:

我认为你不能完全实现你所要求的,但你可以通过将它分成两个接口来接近:

interface Command<out Payload, CommandResult> {
    fun run(): CompletableFuture<CommandResult>

    // other members
}

interface SimpleCommand<out Payload> : Command<Payload, Void> {
    override fun run() = CompletableFuture.runAsync{}
}

【讨论】:

  • 我以前做过类似的事情,使用命令和可运行命令。它有效,但有一些问题的想法。在这里,我有一个 CommandProcessor 必须能够同时运行这两个命令,而不知道它是否简单
  • 所以我大概可以写两个process()函数:process(runnableCommand)process(simpleCommand)
  • 因为SimpleCommand扩展了Command,它可以在任何可以传递Command&lt;Something, Void&gt;的地方传递,你不需要为此做任何特别的事情。
猜你喜欢
  • 2020-06-24
  • 2013-04-17
  • 2023-03-14
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
相关资源
最近更新 更多