我有一些類層次結構:
trait Params
trait ParamsWithName extends Params {
val name: String
}
case class ParamsWithNameAndValue(name: String, value: String) extends ParamsWithName
我想實作一些將使用這些的類。以下作品:
trait Worker[T <: ParamsWithName] {
def work(parameters: T): String = parameters.name
}
class SimpleWorker extends Worker[ParamsWithNameAndValue] {
override def work(parameters: ParamsWithNameAndValue): String = s"${parameters.name} ${parameters.value}"
}
以下沒有:
trait Worker {
def work[T <: ParamsWithName](parameters: T): String = parameters.name
}
class SimpleWorker extends Worker {
override def work[ParamsWithNameAndValue](parameters: ParamsWithNameAndValue): String = s"${parameters.name} ${parameters.value}"
}
錯誤是:
error: value name is not a member of type parameter ParamsWithNameAndValue
override def work[ParamsWithNameAndValue](parameters: ParamsWithNameAndValue): String = s"${parameters.name} ${parameters.value}"
error: value value is not a member of type parameter ParamsWithNameAndValue
override def work[ParamsWithNameAndValue](parameters: ParamsWithNameAndValue): String = s"${parameters.name} ${parameters.value}"
我想了解為什么會這樣。
Scala 版本是 2.12。
uj5u.com熱心網友回復:
這:
trait Worker[T <: ParamsWithName] {
def work(parameters: T): String = parameters.name
}
意味著Worker型別本身是引數化的T (它必須是 的子型別ParamsWithName)。這意味著一個具體實體Worker僅適用于一種這樣的具體型別T
因此,這里:
class SimpleWorker extends Worker[ParamsWithNameAndValue] {
您是說SimpleWorker型別是Worker[ParamsWithNameAndValue]含義的子型別,所有實體SimpleWorker都是Worker[ParamsWithNameAndValue]
鑒于,這:
trait Worker {
def work[T <: ParamsWithName](parameters: T): String = parameters.name
}
意味著任何實體Worker都有一個引數化的方法work(T 它必須是 ParamsWithName 的子型別)。暗示 anyWorker必須能夠處理任何可能的型別T
因此,這里:
class SimpleWorker extends Worker {
override def work[ParamsWithNameAndValue](parameters: ParamsWithNameAndValue): String = s"${parameters.name} ${parameters.value}"
}
您不僅有語法錯誤,還有概念問題。
因為你想說workonSimpleWorker方法只能接受ParamsWithNameAndValue,但這違反了Liskov替換原則。
總之,第一種方法是對您想要的意圖進行編碼的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424390.html
標籤:斯卡拉
