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