2012-10-23 65 views
2

有人可以解釋和提供使用with關鍵字定義類型的真實世界的例子嗎?斯卡拉類型A = B與C,'與`是什麼意思

讓我們來定義類型

type T = A with B 

是什麼意思? 什麼時候應該使用它? 如何實例化類型T

+0

謝謝賈斯珀。我不知道這個功能。 –

回答

9

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)