对Java枚举使用类型别名

时间:2009-10-22 09:13:17

标签: scala enums

我希望实现类似于scala将Map定义为两者预定义typeobject的内容。在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)

但是,在同时导入我的类型别名时这是不可能的。 注意:如果我没有声明预定义类型并导入它,这段代码会正常工作!我可以使用一些语法来实现这个目的吗?

2 个答案:

答案 0 :(得分:5)

Scala 2.8引入了包对象的概念。很多在Predef中的东西都被移到了scala包的包对象中。

“如何创建全局别名”形式的问题通常有答案:使用包对象。 (你不能自己创建一个真正的全局别名,为Scala开发人员保留权力,但是你可以在你的一个包及其子包中提供自己的名字或别名,这要归功于Scala中包的真正嵌套特性。)

不幸的是,包对象上没有SID(Scala改进文档),但一些有用的链接包括:

答案 1 :(得分:1)

在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使用static import

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};