Использование псевдонимов типов для перечислений Java
Вопрос
Я хотел бы добиться чего-то похожего на то, как scala определяет Map
как и то , и другое заранее определенный type
и object
.В Predef
:
type Map[A, +B] = collection.immutable.Map[A, B]
val Map = collection.immutable.Map //object Map
Однако я бы хотел сделать это с помощью Java enum
s (из общей библиотеки).Так, например, у меня был бы какой-нибудь глобальный псевдоним:
type Country = my.bespoke.enum.Country
val Country = my.bespok.enum.Country //compile error: "object Country is not a value"
Причина этого в том, что я хотел бы иметь возможность использовать такой код, как:
if (city.getCountry == Country.UNITED_KINGDOM) //or...
if (city.getCountry == UNITED_KINGDOM)
Однако это невозможно при одновременном импорте моего псевдонима типа. Примечание:этот код работал бы просто отлично, если бы я не объявил предопределенного типа и не импортировал его! Есть ли какой-нибудь синтаксис, который я могу использовать здесь для достижения этой цели?
Решение
Scala 2.8 вводит концепцию объектов пакета.Многое из того, что было в Predef в 2.7, было перенесено в объект package пакета scala.
Вопросы вида "как мне создать глобальный псевдоним" часто содержат ответ:используйте объекты пакета.(Вы не можете создать действительно глобальный псевдоним самостоятельно, эта возможность зарезервирована за разработчиками Scala, но вы можете сделать свое собственное имя или псевдоним доступным в одном из ваших пакетов и его подпакетах, благодаря действительно вложенному характеру пакетов в Scala.)
К сожалению, для объектов пакета нет SID (документа по улучшению Scala), но некоторые полезные ссылки включают:
Другие советы
В Scala просто используйте импорт:
import mypackage.Country
import mypackage.Country._
val c = Country.FRANCE
// With pattern matching:
c match {
case UK => println("UK")
case FRANCE => println("FRANCE")
}
// Or with an if:
if (c == FRANCE) println("FRANCE")