2013-04-12 2 views
1

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

class TwoWayMap[S,T]() 
{ 
    ... 
} 

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

def apply(t : T) 
def apply(s : S) 

, но очевидно, что это не работает, если типы совпадают, поэтому Я хотел бы ограничить S! = T

+0

Я думаю, было бы лучше, если бы вы могли обеспечить мотивацию для этого. Я не думаю, что вы можете это сделать (совсем не уверен). В основном мы говорим только о нижних и верхних границах общих типов. Мне кажется, что вы хотите, вероятно, что-то, что можно получить благодаря лучшему дизайну программы. – Felix

+0

Я улучшил свой пример, чтобы показать мотивацию! – paulmdavies

+0

Вы можете, конечно, сделать это во время выполнения с помощью отражения, но, похоже, вам нужна исправлена ​​ошибка, верно? Я бы, конечно, сказал, что если люди используют один и тот же тип, они не имеют понятия, что они делают в любом случае, и вам может быть достаточно исключений во время выполнения. – Felix

ответ

1

В дополнение к тому, что написал Йоа Эберт: Одним из возможных путей решения этой проблемы является использование типа Either:

class TwoWayMap[S,T] { 
    def apply(k:Either[S,T]):Either[S,T] = k match { 
     case Left(s) => Right(tForS(s)) 
     case Right(t) => Left(sForT(t)) 
    } 
    // ... 
} 

Может быть, это слишком много шаблонного для вас, хотя.

+0

Нет, абсолютно нет, это действительно здорово. Благодаря! – paulmdavies

2

Из-за стирания стилей Java как , так и def apply(s: S) приведет к def apply(...: Object), который был бы неоднозначным.

Так что даже если вы найдете ограничение на S != T, это невозможно.

Смежные вопросы