2
有人可以解釋和提供使用with
關鍵字定義類型的真實世界的例子嗎?斯卡拉類型A = B與C,'與`是什麼意思
讓我們來定義類型
type T = A with B
是什麼意思? 什麼時候應該使用它? 如何實例化類型T
?
有人可以解釋和提供使用with
關鍵字定義類型的真實世界的例子嗎?斯卡拉類型A = B與C,'與`是什麼意思
讓我們來定義類型
type T = A with B
是什麼意思? 什麼時候應該使用它? 如何實例化類型T
?
I guess它被稱爲類型連詞。
您可以使用它來強制某個類型必須擴展所有指定的特徵/類。一個愚蠢的例子:
scala> trait Quackable {
| def quack = println("quack")
| }
defined trait Quackable
scala> trait Walkable {
| def walk = println("walk")
| }
defined trait Walkable
scala> case class Duck(name: String) extends Quackable with Walkable
defined class Duck
scala> def foo(d: Quackable with Walkable): Unit = {
| d.quack
| d.walk
| }
foo: (d: Quackable with Walkable)Unit
scala> foo(Duck(""))
quack
walk
// Or you can create a type alias and use it.
scala> type QW = Quackable with Walkable
defined type alias QW
scala> def foo(d: QW): Unit = {
| d.quack
| d.walk
| }
foo: (d: QW)Unit
scala> foo(Duck(""))
quack
walk
// If you need to retain the type information for some reason, you can use a type parameter.
scala> def foo[A <: Quackable with Walkable](d: A): A = {
| d.quack
| d.walk
| d
| }
foo: [A <: Quackable with Walkable](d: A)A
scala> foo(Duck(""))
quack
walk
res1: Duck = Duck()
至於「如何實例化它」:不要這樣想。 type
創建類型別名/同義詞/函數,它們不一定代表具體的可實例化類型。
編輯:
如果你熟悉Java,with
如上採用的是類似於Java的&
。
public static <QW extends Quackable & Walkable> void foo(QW d) {
d.quack();
d.walk();
}
但是不像Java的&
,with
給你一個正確的類型。我寫的foo
的第一個定義不能轉換爲Java。你也不能用Java的&
來做以下事情。
scala> case object Quackawalkasaurus extends Quackable with Walkable
defined module Quackawalkasaurus
scala> List(Duck(""), Quackawalkasaurus)
res2: List[Product with Serializable with Quackable with Walkable] = List(Duck(), Quackawalkasaurus)
// Add an explicit type annotation if you want to remove unwanted common super-traits/classes.
scala> List(Duck(""), Quackawalkasaurus) : List[Quackable with Walkable]
res3: List[Quackable with Walkable] = List(Duck(), Quackawalkasaurus)
謝謝賈斯珀。我不知道這個功能。 –