2014-11-25 3 views
0

У меня есть функция с параметром, который может иметь тип Int, Long или любые дети AnyVal, кроме Unit, также может быть строкой. Я хотел бы явно указать, что вы можете только поместить значение одного из этих типов в качестве параметра. Я мог бы просто положить Any, но это ничего не ограничило бы. Есть ли в Scala концепция или функция, предлагающая эту возможность? Если не так, как бы вам это удалось? На данный момент я просто управляю любым исключением в функции, если тип несовместим.Параметры функции предельных значений Scala Возможные типы

Нет коды, чтобы показать действительно:

def myFunction(param: Any) = {...} 
+0

Вы также хотите разрешить классы значений? – gzm0

+0

Также, пожалуйста, напишите код, который у вас уже есть, чтобы мы могли лучше понять. – gzm0

+0

Я только хочу разрешить некоторые конкретные типы, среди которых Int, Long, String ... – sam

ответ

5

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

sealed trait Helper[T] 
object Helper { 
    implicit object IntHelper extends Helper[Int] {...} 
    implicit object StringHelper extends Helper[String] {...} 
    ... 
} 

def myFunction[T: Helper](t: T) = ... 

Это путь myFunction может быть вызван только для T, для которого вы определили Helper, и вы можете выразить более сложные ограничения, используя «рекурсивные импликации» (неявные функции с неявными параметрами).

Вы также можете поместить конкретные случаи реализации вашей функции в объекты Helper, а не сопоставлять случаи в функции, делая все более типичным.

+0

Кажется хорошим для меня, если никто не предложит ничего, что мне кажется лучше, я соглашусь с этим ответом :) – sam

2

Вы можете использовать типовые классы, чтобы сделать это:

trait CanUse[T] 

object CanUse[T] { 
    implicit object canUseInt extends CanUse[Int] 
    implicit object canUseString extends CanUse[String] 
    // etc. 
} 

def myFunction[T : CanUse](x: T) = { ... } 

Запись на myFunction является синтаксически:

def myFunction[T](x: T)(implicit ev: CanUse[T]) = { ... } 

Таким образом, вы можете увидеть, что ваши неявные canUse объекты на самом деле прошли к вашей функции. Поэтому вы можете добавлять к ним методы и реализовывать поведение типа.

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