2016-10-24 11 views
2

コンパイラがタイプパラメータとして列挙を使用したいと思っています。Scalaで型パラメータとして列挙型を使用できますか?

object VehicleClass extends Enumeration { 
    type VehicleClass = Value 
    val Land, Air, Sea = Value 
} 
import VehicleClass._ 

trait Vehicle[K <: VehicleClass] { val kind: K } 
case class Car(passengers: Int) extends Vehicle[Land] { val kind: Land } 

コンパイラは文句:

[error] /Users/me/test/scala/co.blocke.scalajack/json/test.misc/Greg.scala:18: not found: type Land 
[error] case class Car(passengers: Int) extends Vehicle[Land] { val kind: Land } 
[error]            ^
[error] /Users/me/test/scala/co.blocke.scalajack/json/test.misc/Greg.scala:18: not found: type Land 
[error] case class Car(passengers: Int) extends Vehicle[Land] { val kind: Land } 
[error]                 ^

はどのようにこれを行うことができますか?

+2

なぜ列挙が必要ですか?たぶんあなたは密閉型のVehicleClassとLand、Air、Seaを使って同様の結果を得ることができるかもしれません –

+0

アレクセイがEnumerationsで作業することができると言いますが、これはJosep指摘している。私はscala.Enumerationを使用することはありません。このリンクは、http://underscore.io/blog/posts/2014/09/03/enumerations.htmlの詳細を理解するのに役立ちます。 – iain

答えて

2

あなたは

case class Car(passengers: Int) extends Vehicle[Land.type] { 
    val kind: Land.type = Land 
} 

Land.type、すなわち唯一の値(null含まない)LandあるタイプシングルトンタイプLand、で書くことができます。

1

アレクセイは、私が代わりに非推奨と私は考えて列挙のADTを使用してこの問題に対処するだろうscala.Enumeration

を使用するための正しい答えを提供してきました。ここで

、一般的には要件がtrait Vehicleがジェネリックにするために表示されていないとして、私は、多少このコードを単純化する

// Using an abstract class makes accessing things in VehicleClass companion 
// object nicer 
sealed abstract class VehicleClass 

case object Land extends VehicleClass 
case object Air extends VehicleClass 
case object Sea extends VehicleClass 

trait Vehicle[K <: VehicleClass] { val kind: K } 
case class Car(passengers: Int) extends Vehicle[Land.type] { val kind = Land } 

のADTを使用したソリューションです(http://underscore.io/blog/posts/2014/09/03/enumerations.htmlを参照してください)。これがあなたのコードに追加する安全性は何ですか?私は一般的に

trait Vehicle { val kind: VehicleClass } 

に形質を簡素化するでしょう(私はVehicleがジェネリックにするために見ることができる唯一の理由は、Vehicle[Land]のための代わりのVehicle[Land]の種類のすべてのための型クラスのインスタンスを定義したが、その後Vehicleことであろう、おそらく必要があるだろう他のメンバー。)

関連する問題