2009-10-22 72 views
3

我想实现类似于scala如何定义Map预定义typeobject。在Predef使用类型别名到Java枚举

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) 

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

回答

5

斯卡拉2.8引入了包对象的概念。 2.7中Predef中的很多东西已经移到了scala包的包对象中。

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

不幸的是,不能在包装对象SID(Scala的改进文献),但一些有用的链接包括:

1

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

​​
+0

Alexandre - 这是一个** Scala **问题 - 不是Java的问题! – 2010-01-26 07:42:29

+0

更改了Scala的答案 – 2010-01-27 18:18:24