我有3個特點:
trait Worker
...
trait StringWorker extends Worker {
def workString(): Iterator[String]
}
...
trait IntWorker extends Worker {
def workInt(): Iterator[Int]
}
我的一些類只擴展StringWorker,而另一些則同時擴展StringWorker和IntWorker
我的代碼根據一些模式匹配獲得正確的決議器,如下所示:
def getCorrectWorkerProvider: () => Worker = {
case SomeCase => getStringWorkerProvider()
case _ => getIntWorkerProvider()
}
如果我保持與上面寫的相同的特征,那么我幾乎總是必須做這樣的偽代碼:
if working with string, then getCorrectWorkerProvider().asInstanceOf[StringWorker].workString
if working with int, then getCorrectWorkerProvider().asInstanceOf[IntWorker].workInt
而如果我將特征的定義更改為如下所示:
trait Worker {
def workString(): Iterator[String]
def workInt(): Iterator[Int]
}
trait StringWorker extends Worker
trait IntWorker extends Worker
那么我將永遠不必使用.asInstanceOf[SomeWorker]來呼叫正確的方法。我相信第一種方法更正確和直觀,因為方法特定于某個 Worker,但第二種方法似乎不那么令人頭疼。
uj5u.com熱心網友回復:
我相信您正在尋找的東西稱為型別類模式。 這是一篇解釋這個想法的文章。基本上它的作業方式是你創建一個函式,它接受一個型別的值T和一個隱式引數Worker[T],然后 scala 的隱式決議機制Worker[T]為你找到合適的。
這是一個例子:
object Main {
def main(args: Array[String]): Unit = {
work("String")
work(3)
}
def work[T](value: T)(implicit worker: Worker[T]) = {
worker.work(value)
}
}
trait Worker[T]{
def work(t: T): Iterator[T]
}
object Worker {
implicit val stringWorker: Worker[String] = (t: String) => Iterator(t)
implicit val intWorker: Worker[Int] = (t: Int) => Iterator(t)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424405.html
標籤:斯卡拉
