2017-10-30 15 views
2

하이에서 케이스 클래스 사본 나는 "우아한"의 종류의 문제를 해결하고 안전한 방법을 입력하기 위해 노력하고있어하지만 난 최선을 찾을 수스칼라.</p> <p>의 내가이 특성을 가지고 있다고 가정 해 봅시다 ... 특성 참조

trait Event { 
    def deviceId: String 
    def userId: String 
    def eventDateTime: DateTime 
    def payload: Option[Payload] 
} 

trait Payload 
그리고 다음과 같은 경우 클래스 ...

case class AEvent (deviceId: String, userId: String, eventDateTime: DateTime, payload: Option[APayload]) extends Event 
case class APayload (content: String) 


case class BEvent (deviceId: String, userId: String, eventDateTime: DateTime, payload: Option[BPayload]) extends Event 
case class BPayload (size: Int, name: String) 

내가 AEvent 또는 BEVENT에 캐스팅없이 특성에서 직접 케이스 클래스 복사 방법을 사용하고 싶습니다 (더있을 수 있습니다)

이 같은 방법을 만들기 위해 나는 특성에 대한 참조를 데 따라

이 최선의 해결책 내가 알아 낸 것입니다 :

def copy[T <: Event](event: T)(deviceId: String = event.deviceId, 
          userId: String = event.userId, 
          eventDateTime: DateTime = event.eventDateTime, 
          payload: Option[Payload] = event.payload) T = { 
    val res = event match { 
    case x: AEvent => AEvent(deviceId, userId, eventDateTime, payload.asInstanceOf[APayload]) 
    case x: BEvent => BEvent(deviceId, userId, eventDateTime, payload.asInstanceOf[BPayload]) 
    } 
res.asInstanceOf[T] 
} 

내가 좋아하지 않는 것은 런타임에 주조되는 페이로드 유형이를 ... 컴파일 타임에 어떻게 타입 체크를 할 수 있습니까? 사전에

감사

답변

0

무엇

case class Event[P <: Payload](deviceId: String, userId: String, eventDateTime: DateTime, payload: Option[P]) 

Event[APayload] 대신 AEvent 사용

어떻습니까?

+0

답장을 보내 주셔서 감사합니다. 그렇지만 Event [APayload] 유형의 val을 인스턴스화 할 수 있습니다. 그런 다음 copy를 호출 할 때 대신 BPayload를 전달하므로 피하고 싶지 않은 이벤트 유형을 "변경"합니다. –

+0

이 문제를 피하기 위해 자동으로 대신에'copy' 메소드를 사용하십시오. –