Использование псевдонимов типов для перечислений Java
Я хотел бы достичь чего-то похожего на то, как scala определяет Map
как и предопределенные type
и object
. В Predef
:
type Map[A, +B] = collection.immutable.Map[A, B]
val Map = collection.immutable.Map //object Map
Однако я хотел бы сделать это, используя Java enum
(из общей библиотеки). Например, у меня будет глобальный псевдоним:
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)
Как бы то ни было, это невозможно, одновременно импортируя псевдоним типа. Примечание: этот код будет работать нормально, если я не объявил предопределенный тип и не импортировал его! Есть ли какой-нибудь синтаксис, который я могу использовать для достижения этого?
Ответы
Ответ 1
Scala 2.8 вводит понятие объектов пакета. Многие вещи, которые были в Predef в версии 2.7, были перемещены в объект пакета пакета scala.
Вопросы формы "как сделать глобальный псевдоним" часто имеют ответ: используйте объекты пакета. (Вы сами не можете сделать поистине глобальный псевдоним, эта власть зарезервирована для разработчиков scala, но вы можете сделать свое собственное имя или псевдоним доступными на одном из ваших пакетов и его подпакетах, благодаря действительно вложенному характеру пакетов в Scala.)
К сожалению, на объектах пакета нет идентификатора SID (Scala), но некоторые полезные ссылки включают в себя:
Ответ 2
В Scala просто используйте import:
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")
И для Java используйте статический импорт:
package mypackage;
import static mypackage.Country.*;
public class Test {
public static void main(String[] args) {
Country c = UK;
if (c == FRANCE) {
System.out.println("Ok");
}
}
}
enum Country {FRANCE, UK};