2011-01-31 16 views
1

解決策がこれに対応するはずの問題を抱えています:Enumerationを指定してすべてのリストを返すメソッドを記述したいとしますその値。私が書きたい:Scalaの列挙型とパス依存型を扱う方法

def makeList[E <: Enumeration](enum: E): List[enum.Value] = enum.values.toList 

ますが、コンパイルはillegal dependent method typeエラーで失敗します。代わりにこれを書いても構いませんか?

def makeList[E <: Enumeration](enum: E): List[E#Value] = enum.values.toList 
+3

私はscalaと思う唯一の人です.Enumerationはかなり壊れていますか? – soc

+0

私はScalaの初心者ですが、列挙に関しては、フィールドや他のメソッドを追加するという可能性をもって、Javaでよりうまく機能しました...もちろん、ケースオブジェクトを持つ密閉された特性は、インスタンスは、すべての定義された要素で 'values' seqを提供しません。 –

答えて

3

あなたがそこにパス依存型を使用することができますが、それは今の実験的な機能です:通常、すべての列挙に、Valueが同じタイプであることに注意してください。 scalaまたはscalacには-Xexperimentalを使用します。

$ scala -Xexperimental 
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_21). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> def makeList[E <: Enumeration](enum: E): List[enum.Value] = enum.values.toList 
makeList: [E <: Enumeration](enum: E)List[enum.Value] 

scala> object Bool extends Enumeration { 
    | type Bool = Value 
    | val True, False = Value 
    | } 
defined module Bool 

scala> makeList(Bool) 
res0: List[Bool.Value] = List(True, False) 
+0

実際、私と一緒に働くものは、-Xexperimentalフラグではなく-Yependent-method-typesです。 –

1

私にはOKのようです:コメントへの返信で

object WeekDay extends Enumeration { 
    type WeekDay = Value 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 

> makeList(WeekDay) 
res2: List[WeekDay#Value] = List(Mon, Tue, Wed, Thu, Fri, Sat, Sun) 

> makeList(WeekDay.Mon) 
error: inferred type arguments [WeekDay.Value] do not conform to method makeList's type parameter bounds [E <: Enumeration] 
     makeList(WeekDay.Mon) 
    ^

UPDATE:

私は代わりValValue入れ子になったクラスをオーバーライドすることができる誰かを推測する(Iだけソースを見て、それは封印されていない)が、私は理由を考えることができません。

object Bool extends Enumeration { 
    type Bool = Value 
    val True, False = Value 
} 

> Bool.True.getClass 
res8: java.lang.Class[_] = class scala.Enumeration$Val 
> Bool.True.getClass == WeekDay.Mon.getClass 
res7: Boolean = true 
+0

私はちょうど私が型投影(E#Value)が必要であることに困惑しています。ちょうど1つの型、つまり何らかの理由でenum.Valueに一致させたいと思います。私の型投影が他の型と一致しないことを確認できますか? –