質問
scalaが Map
を both として定義済みの type
と object
として定義する方法に似たものを実現したい。 Predef
で:
type Map[A, +B] = collection.immutable.Map[A, B]
val Map = collection.immutable.Map //object Map
ただし、Java enum
s(共有ライブラリから)を使用してこれを実行したいと思います。たとえば、グローバルエイリアスがいくつかあります:
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 2.8では、パッケージオブジェクトの概念が導入されています。 2.7でPredefにあったものの多くがscalaパッケージのパッケージオブジェクトに移動されました。
「グローバルエイリアスを作成する方法」という形式の質問多くの場合、答えは「パッケージオブジェクトを使用する」です。 (あなたは真にグローバルなエイリアスを自分で作ることはできません、その力はScala開発者のために予約されていますが、Scalaのパッケージの真にネストされた性質のおかげで、パッケージとそのサブパッケージのいずれかで自分の名前またはエイリアスを利用可能にすることができます。)
残念ながら、パッケージオブジェクトにはSID(Scala Improvement Document)はありませんが、役立つリンクがいくつかあります。
他のヒント
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の場合は静的インポート:
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};
所属していません StackOverflow