Использование псевдонимов типов для перечислений Java

StackOverflow https://stackoverflow.com/questions/1605976

  •  05-07-2019
  •  | 
  •  

Вопрос

Я хотел бы добиться чего-то похожего на то, как scala определяет Map как и то , и другое заранее определенный type и objectPredef:

type Map[A, +B] = collection.immutable.Map[A, B]
val Map = collection.immutable.Map //object Map

Однако я бы хотел сделать это с помощью Java enums (из общей библиотеки).Так, например, у меня был бы какой-нибудь глобальный псевдоним:

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")

А для 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};
scroll top