2016-06-19 42 views
0

可能な解決策はありますか?私は値がEnumで、その要素は別の列挙型です。列挙型の列挙型の列挙型へのアクセス

object NumEnum extends Enumeration { 
    val EVEN = Value(TWO, FOUR, SIX) 
    val ODD = Value(ONE, THREE, FIVE) 

    val numbersByType = for { 
    nt <- NumberEnum.values 
    n <- nt.[here i wanna collection values but the only thing i can get is.id of enum] 
    } yield 
    ... 

    class CustomVal(val nums: Num) extends Val 

    protected final def Value(nums: Num): CustomVal = new CustomVal(nums) 
} 

class Num extends Enumeration { 
    val ONE, TWO, THREE, FOUR, FIVE, SIX = Value 
} 

javaでは、getEnumConstants()を使用して型のマップを埋め込むことができます。スカラーでこれをする機会はありますか?

+0

値を試してください。 http://www.scala-lang.org/api/current/index.html#scala.Enumeration –

答えて

1

あなたの試みに続いて - そう(まだ醜い)の作業、あなたは選択の余地がないように見えるが(それはあなたがそれらを建てた方法ですので、あなたはこの列挙の値はそのタイプであることを知っている)CustomValntをキャスト生み出す

object Num extends Enumeration { 
    val ONE, TWO, THREE, FOUR, FIVE, SIX = Value 
} 

object NumEnum extends Enumeration { 
    import Num._ 

    val EVEN = Value(TWO, FOUR, SIX) 
    val ODD = Value(ONE, THREE, FIVE) 

    val numbersByType = for { 
    nt <- NumEnum.values 
    n <- nt.asInstanceOf[CustomVal].nums // ugly casting 
    } yield (nt, n) // I'm assuming you want something like this? 

    class CustomVal(val nums: Seq[Num.Value]) extends Val 

    protected final def Value(nums: Num.Value*): CustomVal = new CustomVal(nums) 
} 

:そのような解決策に直面したとき

scala> NumEnum.numbersByType 
res0: scala.collection.immutable.SortedSet[(NumEnum.Value, Num.Value)] = TreeSet((EVEN,TWO), (EVEN,FOUR), (EVEN,SIX), (ODD,ONE), (ODD,THREE), (ODD,FIVE)) 

は、しかし、私はちょうど良い古いのJavaの列挙型に戻し、あなたのコードのバージョンは次のようになります彼らはScalaコードで簡単に使うことができます。

+0

を参照してください。これはうまくいきますが、動作させるために明示的にValueSet .toSeqをキャストしなければならなかったので、 Javaの列挙型のサポート、imho – Dmitrii