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

时间:2014-07-11 03:52:36

标签: 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()

1 个答案:

答案 0 :(得分:3)

您可以通过&#34;取消删除&#34;来匹配方法的类型参数。它带有隐式ClassTag参数。

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的最常见选择。我不知道有什么方法。