使用类型别名来定义Java枚举类型

4
我希望能够像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)

然而,当我同时导入我的类型别名时,这是不可能的。注意:如果我没有声明预定义类型并导入它,这段代码将完美运行!这里有一些语法可以使用来实现这个目标吗?

2个回答

5
Scala 2.8 引入了包对象的概念。在 2.7 中 Predef 中的许多内容已经移动到 scala 包的包对象中。
形如“如何制作全局别名”的问题通常的答案是:使用包对象。 (你无法自己创建真正的全局别名,这种权力是保留给 Scala 开发人员的,但是由于 Scala 中包的嵌套性质,你可以使自己的名称或别名在一个包及其子包中始终可用。)
不幸的是,包对象上没有 SID(Scala 改进文档),但一些有用的链接包括:

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,请使用静态导入

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

Alexandre - 这是一个 Scala 问题 - 不是 Java 的问题! - oxbow_lakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接