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)
}
}