2013-04-23 70 views
1

是否有可能對Scala中兩個不相關的類型有限制? 例如,類型綁定爲兩個不相關的類型

trait A 
trait B 
def m(T <: A or B) ???? 

感謝

+2

你能砍周圍http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types – 2013-04-23 15:15:07

回答

1

如果您AB是完全不相關的(例如,你所需要的,否則,你可以只使用結構類型不常用的方法),這意味着當你使用它作爲方法參數,您仍然需要實際使用的類型。

在這種情況下,Either[A, B]正是您所需要的。它表示一個對象必須是A或B中的一個,並且您可以在任一類中使用模式匹配或其他方法來檢查它們。

例如:

class MyClassA { 
    def methodA() = println("I'm A") 
} 

class MyClassB { 
    def methodB() = println("I'm B") 
} 

def m(a: Either[MyClassA, MyClassB]) { 
    a match { 
    case Left(a) => a.methodA() 
    case Right(b) => b.methodB() 
    } 
} 

m(Left(new MyClassA)) // OK 
m(Right(new MyClassB)) // OK 
m(Left(new MyClassB)) // Failed, a Left must be a MyClassB instance 

你可能有興趣在此article,這說明了什麼或者是很清楚。

+0

小點;最後一行是一樣的倒數第三行 - 也許你的意思是'M(左(新MyClassB))'或'M(右(新MyClassA))'。此外,爲了簡明起見,在M'的'主體,可以使用'a.fold(A => a.methodA()中,b => b.methodB())',或甚至'a.fold(_。 methodA(),_.methodB())' – 2013-04-23 22:47:01

+0

@KristianDomagala你,我在那裏得到一個錯字。謝謝。 :) – 2013-04-23 23:14:34

+0

參見[這個答案](http://stackoverflow.com/a/6312508/217959)對@ OM-NOM-NOM掛鉤的問題。萬里薩賓已經有一個[博客文章(http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/)證明* *拆箱聯合類型 - 這滴無論是包裝完全對象。 – nadavwr 2013-04-25 23:42:55