[英]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.