Scala: дисперсия типов и сопоставление с образцом между двумя равными типами - PullRequest
2 голосов
/ 22 апреля 2010

На днях я играл с классом для обработки некоторых арифметических операций (да, я знаю, что в 2.8 выйдет число) и обнаружил, что задаюсь вопросом, как упростить следующее:

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 может наследоваться от типа _1, "A" может быть общей чертой или так далее. Я знаю, что это означает, что компилятор должен протестовать, чтобы защитить код. Есть ли способ сказать «Я хочу, чтобы _1 и _2 были одним и тем же классом extact», чтобы мне не нужно было делать двойное объявление _1:Int, _2:int?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Я бы использовал здесь вместо этого перегрузку.

1 голос
/ 22 апреля 2010

Возможно, я вас неправильно понимаю, но если вы просто хотите, чтобы два параметра были одинакового типа, вы можете сделать что-то вроде следующего:

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

Указывает, что B является как нижним, так и верхним типом, ограниченным A, поэтому должно быть A. Таким образом, он будет компилироваться, только если _1 и _2 относятся к одному типу.

...