Использование псевдонимов типов для перечислений 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)
Однако это невозможно при одновременном импорте моего псевдонима типа. Примечание: этот код работал бы отлично, если бы я не объявил предопределенный тип и не импортировал его! Есть ли какой-то синтаксис, который я могу использовать здесь, чтобы достичь этого?
2 ответа
Scala 2.8 представляет концепцию объектов пакета. Многое из того, что было в Predef в 2.7, было перенесено в объект пакета пакета scala.
Ответы на вопросы типа "как сделать глобальный псевдоним" часто имеют ответ: используйте объекты пакета. (Вы не можете сделать действительно глобальный псевдоним самостоятельно, эта мощность зарезервирована для разработчиков Scala, но вы можете сделать свое собственное имя или псевдоним доступными для одного из ваших пакетов и его подпакетов, благодаря действительно вложенной природе пакетов в Scala.)
К сожалению, нет SID (Scala Improvement Document) для объектов пакета, но некоторые полезные ссылки включают в себя:
В 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")
А для 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};