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