2010-04-22 27 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

我想在这里使用重载。