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]
}
내가 좋아하지 않는 것은 런타임에 주조되는 페이로드 유형이를 ... 컴파일 타임에 어떻게 타입 체크를 할 수 있습니까? 사전에
감사
답장을 보내 주셔서 감사합니다. 그렇지만 Event [APayload] 유형의 val을 인스턴스화 할 수 있습니다. 그런 다음 copy를 호출 할 때 대신 BPayload를 전달하므로 피하고 싶지 않은 이벤트 유형을 "변경"합니다. –
이 문제를 피하기 위해 자동으로 대신에'copy' 메소드를 사용하십시오. –