Использование псевдонимов типов для перечислений Java - PullRequest
4 голосов
/ 22 октября 2009

Я бы хотел добиться чего-то похожего на то, как 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 ]

5 голосов
/ 01 апреля 2010

Scala 2.8 представляет концепцию объектов пакета. Многое из того, что было в Predef в 2.7, было перемещено в объект пакета пакета scala.

Вопросы формы «как создать глобальный псевдоним» часто имеют ответ: используйте объекты пакета. (Вы не можете сделать действительно глобальный псевдоним самостоятельно, эта мощность зарезервирована для разработчиков Scala, но вы можете сделать свое собственное имя или псевдоним доступными для одного из ваших пакетов и его подпакетов, благодаря действительно вложенной природе пакетов в Scala .)

К сожалению, нет SID (Scala Improvement Document) для объектов пакета, но некоторые полезные ссылки включают в себя:

1 голос
/ 26 января 2010

В 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};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...