【问题标题】:Using type aliases to Java enums对 Java 枚举使用类型别名
【发布时间】:2010-12-09 00:34:45
【问题描述】:

我想实现类似于 scala 如何将 Map 定义为 both 预定义的 typeobject 的东西。在Predef

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 enums


    【解决方案1】:

    Scala 2.8 引入了包对象的概念。 2.7 中 Predef 中的许多内容已移至 scala 包的包对象中。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Alexandre - 这是一个 Scala 问题 - 不是 Java 问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多