Псевдоним типа Scala, включая сопутствующий объект [новичок]

Я хотел бы написать псевдоним типа для сокращения, красивого и инкапсулированного кода Scala. Предположим, у меня есть некоторая коллекция, которая имеет свойство быть списком карт, значениями которых являются кортежи. Мой тип мог бы написать что-то вроде List [Map [Int, (String, String)]] или что-нибудь более общее, насколько позволяет мое приложение. Я мог бы представить себе супертип, запрашивающий Seq [MapLike [Int, Any]] или что-то еще, что плавает моя лодка, с конкретными подклассами.

Затем я бы хотел написать псевдоним для этот длинный тип.

class ConcreteClass {
  type DataType = List[Map[Int, (String, String)]]
  ...
}

Тогда я бы с радостью использовал ConcreteClass # DataType везде, где я могу взять один, и использовать его.

Теперь предположим, что я добавляю функцию

def foo(a : DataType) { ... }

И я хочу вызвать ее из снаружи с пустым списком. Я могу вызвать foo (List ()) , но когда я хочу изменить свой базовый тип на другой тип Seq , мне придется вернуться и изменить этот код тоже . Кроме того, не совсем ясно, что этот пустой список предназначен как DataType . А сопутствующий объект не имеет связанных методов List , поэтому я не могу вызвать DataType () или DataType.empty . Когда мне понадобятся непустые списки, будет еще больше раздражать, так как мне придется выписывать значительную часть этого длинного типа.

Есть ли способ попросить Scala понять мой тип как то же самое, включая объект-компаньон с методами его создателя в интересах сокращения кода и его черного ящика? Или по какой-либо причине, почему я не должен этого делать?

7
задан Mechanical snail 22 July 2012 в 21:24
поделиться