이의 내가 이제 다음과 같은 특성스칼라 ADT를 -
trait Named {
def name: String
}
다음과 같은 대수 데이터 형식
sealed trait Animal extends Named
case object Dog extends Animal {
override val name: String = "dog man"
}
case object Cat extends Animal {
override val name: String = "cat man"
}
case object Owl extends Animal {
override val name: String = "I am an owl left in the dark"
}
있다고 가정 해 봅시다 일반적인 방식으로 문자열에서 역 직렬화 할 수있는 방법이있다, 다음 방법으로 문자열의 인스턴스를 내 동물 ADT로 역 직렬화 할 수 있습니다.
가 지속 된 값에서 쉽게 인스턴스화 할 수 없습니다
object Animal { def apply(name: String): Animal = name match { case Dog.name => Dog case Cat.name => Cat } }
@oxbow_lakes 그의 answer 그 말에 언급하고있다.이 또한 해당하지만 거대한 열거 형의 경우를 제외하고는 (예 : 모든 통화) 큰 오버 헤드가 발생하지 않습니다.
나는 새 값을 추가 할 때 명시 적으로 발생하기 쉬운 오류로 직렬화 코드에 추가 할 필요가 있다는 사실 (내가 컴파일러 인 - 완전한 일치의 저를 경고하지만,이 걸릴 것이라고 생각 것을 발견 위의 Owl
및 apply
방법을 참조하십시오. 경고가 발행되지 않았습니다 ...)
더 좋은 방법이 있습니까? 당신이 시도 할 수
몽땅, 내 자신의 질문에 대답. 두 개의 게시물을 기반으로 한 해결책을 찾았습니다. http://stackoverflow.com/questions/25838411/cant-prove-that-singleton-types-are-singleton-types-while-generating-type-class 및 http : // /stackoverflow.com/questions/43650265/implicit-arguments-how-to-encode-in-function-signature 다음과 같이 요약됩니다. http://stackoverflow.com/a/43658710/101715 – Yaneeve