2016-10-24 5 views
2

컴파일러에서 유형 매개 변수로 열거 형을 사용하여 나에게 슬픔을주고 싶습니다.스칼라에서 형식 매개 변수로 열거 형을 사용할 수 있습니까?

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

Alexey가 열거 형을 사용하여이 작업을 수행 할 수 있다고 말했듯이이 작업은 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 제네릭 만들기 위해 보이지 않는,

는 여기에 내가 다소 코드를 단순화 할 ADT를

// 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 } 

를 사용하여 솔루션 (http://underscore.io/blog/posts/2014/09/03/enumerations.html 참조). 이것이 코드에 어떤 추가 안전성을 부여합니까? 나는 일반적으로 내가 Vehicle 제네릭 Vehicle[Land] 대신의 Vehicle[Land] 유형의 모든 종류의 클래스 인스턴스를 정의 할 수 있지만 것 다음 Vehicle 아마 필요하게 볼 수 있습니다

trait Vehicle { val kind: VehicleClass } 

(유일한 이유에 특성을 단순화 것 더 많은 회원)

관련 문제