2009-10-22 118 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