2010-04-22 53 views
2

我前幾天在做一個類來處理一些算術運算(是的,我知道數字出現在2.8中),並且發現自己想知道如何簡化以下:Scala:在兩個相同類型之間輸入方差和模式匹配

def Foo[A](_1:A, _2:A) = (_1, _2) match{ 
    case _1:Bar, _2:Bar => _1 + _2 
    case _1:Baff, _2:Baff => _1 push _2 
    case _, _ => None 
} 

,這樣我可以做到這

def Foo[A](_1:A, _2:A) = _1 match{ 
    case _1:Bar => _1 + _2 
    case _1:Baff => _1 push _2 
    case _ => None 
} 

當然,我知道,在聲明函數它已經宣佈_2 S型的類型可以想見,從_1繼承'的方式, 「A」可能是共享的tr ait等等。我知道這意味着編譯器需要抗議以保護代碼。有沒有辦法說「我希望_1和_2是同一個extact類」,這樣我就不必做出雙重_1:Int, _2:int聲明瞭?

回答

1

也許進出口誤解你,但如果你只是想需要兩個參數是相同的類型,你可以這樣做以下:

def Foo[A,B >: A <: A](_1: A, _2:B) = ... 

這指定B既下限和上限類型由A限定,因此必須是A。因此只有在_1_2屬於同一類型時纔會編譯。

+0

我回家試了一下,它不起作用。它甚至沒有編譯。如果超過了重載方法,它會在「+」處失敗。這個東西會在2.8中編譯? – wheaties 2010-04-23 00:04:19

+0

我在2.7.7上試過了,但它應該在2.8上工作。你遇到了什麼錯誤? – 2010-04-23 00:18:28

2

我想在這裏使用重載。