Вместо
def foo(configuration: (String, String)*)
Я хотел бы смочь записать:
type Configuration = (String, String)*
def foo(configuration: Configuration)
Основной вариант использования состоит в том, чтобы обеспечить легкую сигнатуру метода при переопределении в подклассах
ОБНОВЛЕНИЕ: Я могу приблизиться
type Param = (String, String)
def foo(configuration: Param*)
Но есть ли способ сделать его лучше?
Нет, *
допускается только для ParamType, то есть типа параметра анонимной функции или метода.
4.6.2 Повторяющиеся параметры Синтаксис: ParamType ::= Type '' Последнее значение параметра в секции параметров может иметь суффикс "", например, (..., x:T *). Тип такого повторяющегося параметра внутри метода является последовательность типа scala.Seq[T ]. Методы с повторяющимися параметрами T * принимают переменное количество аргументов типа T.
Ошибка компилятора в примере @Eastsun находится в первой строке, а не во второй. Это не должно быть разрешено:
scala> type VarArgs = (Any*)
defined type alias VarArgs
Я поднял ошибку.
Это аналогичное ограничение для By-Name Parameters. В этом случае компилятор предотвращает создание псевдонима типа:
scala> type LazyString = (=> String) <console>:1: error: no by-name parameter type allowed here
type LazyString = (=> String)
Ваша последняя попытка - стандартный способ выразить это.
Я думаю, вы могли бы использовать
type Configuration = ((String, String)*)
def foo(configuration: Configuration)
Но это вызывает сбой компилятора (2.8.0.r21161-b20100314020123). Кажется ошибка компилятора scala.
Вы можете определить это как
type Param = (String, String)
type Configuration = Seq[Param]
def foo(configuration : Configuration)
пользователь должен создать экземпляр Seq
foo(List("1"->"2"))
, что не является оптимальным.