繁体   English   中英

是否可以在Scala中匹配函数的返回类型?

[英]Is it possible to match on a function's return type in Scala?

我对Scala还是很陌生,所以仍然要弄清楚类型推断系统可以做什么。 是否可以在Scala中执行以下操作?

abstract class BaseBar
class DerivedBar1 Extends BaseBar
class DerivedBar2 Extends BaseBar

def foo[T]: List[T] = {
  <T type> match {
    case DerivedBar1 => getSomethingOfTypeDerivedBar1
    case DerivedBar2 => getSomethingOfTypeDerivedBar2
  }
}

...然后可以安全地致电

val myDerivedBar1 = foo[DerivedBar1]()

... 要么

def getBar: DerivedBar2 = foo()

您可以通过使用隐式ClassTag参数“取消擦除”方法来匹配方法的type参数。

import scala.reflect.ClassTag

def foo[T](implicit t: ClassTag[T]) = t.runtimeClass match { /* ... */ }

至于基于预期返回类型的推断:Scala确实将该上下文用作其类型推断的一部分,但我认为您将很难使其在此处执行所需的操作。 例如:

def bar[T](implicit t: ClassTag[T]): List[T] = { println(t.runtimeClass); Nil }
val x: List[String] = bar

您可能希望/希望这将打印class java.lang.String ,但实际上它会打印class scala.runtime.Nothing$因为这是推断T的最一般的选择。 我不知道有什么办法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM