Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何明确地告诉编译器返回类型是什么?_Scala - Fatal编程技术网

Scala 如何明确地告诉编译器返回类型是什么?

Scala 如何明确地告诉编译器返回类型是什么?,scala,Scala,假设我在同一个文件中有一个抽象类和一个同名的对象 如何明确告诉编译器run的返回类型是抽象类CommandResult类型而不是对象CommandResult类型 斯卡拉基地酒店 trait Base { def run[T]: Future[T] } 鳞片线虫 class X extends Base { override def run[CommandResult]: Future[CommandResult] = { // here return CommandRes

假设我在同一个文件中有一个抽象类和一个同名的对象

如何明确告诉编译器
run
的返回类型是抽象类CommandResult类型而不是对象CommandResult类型

斯卡拉基地酒店

trait Base {
  def run[T]: Future[T]
}
鳞片线虫

class X extends Base {
  override def run[CommandResult]: Future[CommandResult] = {
      // here return CommandResult, Success or Failure
  }
}

sealed abstract class CommandResult(val exitCode: Int)

object CommandResult {
  case object Success extends CommandResult(0)
  case object Failure extends CommandResult(1)
}

当您编写
def run[CommandResult]
时,它意味着“run接受一个名为CommandResult的type-one参数”,这就是为什么会出现如下错误:

On line 3: error: type mismatch;
        found   : CommandResult.Success.type
        required: CommandResult              <--- The type parameter, 
                                              not the class or object.

它会起作用。

为什么会这样?那没有道理。同样,类和对象有不同的类型,你不需要做任何事情来区分它们。@LuisMiguelMejíaSuárez忘记添加一些细节
X
扩展了“Base”并实现了run方法。
run[T]
意味着它适用于整个存在中的任何类型。您的子类只适用于其中几个无限的可能性。这基本上违反了里斯科夫原则,这意味着这是不可能做到的。-也许您想将该类型参数移到整个trait。
trait Base[T] {
  def run: Future[T]
}

class X extends Base[CommandResult] {
  override def run: Future[CommandResult] = {
      Future(CommandResult.Success)
  }
}