我希望实现类似于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)
但是,在同时导入我的类型别名时这是不可能的。 注意:如果我没有声明预定义类型并导入它,这段代码会正常工作!我可以使用一些语法来实现这个目的吗?
答案 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};