2017-04-12 1 views
0

확장 클래스에서 기본 클래스를 얻는 방법. 실제로 Scala에서는 새로운 기능으로 봉인 된 특성 클래스를 사용하여 코딩을 작성하려고합니다.스칼라의 봉인 된 형 변환 클래스

예를 들어, 하나의 봉인 된 트레일 클래스와 몇 가지 사례 클래스가 봉인 된 트레일 클래스로 확장되었습니다.

예 : 예 1의 경우

type example1 = RDD[(String, Int, Person)] => RDD[((String, Int), Employee)] 

type example2 = RDD[(String, Int, List[Employer])] => RDD[((String, Int), List[Person])] 

: 다음과 같은 유형의

sealed trait Person 
case class Employer(name: String, id: Int, country: List[String]) extends Person 
case class Employee(name: String, id: Int) extends Person 

내가 찾고 있어요 예를 들어 나는 시도하고 다음 방법 역을 수행하는

def getType1(data: RDD[(String, Int, Person)]) = { 
    val res = data.map { 
     x => { 
     val emp = x._3.asInstanceOf[Employee] 
     ((x._1, X._2), Employee(emp.name, emp.id) 
     ) 
     } 
    } 
} 

을하지만, 유형이 example2 인 경우? 예를 들어 프로젝트를 이해하는 데 도움이 될 것입니다. 제안 해주세요.

+0

첫 번째 예는 안전하지 않습니다. Person이 Employee가 아닌 경우 런타임에 예외가 발생합니다. 대신 고용주가있는 기록으로 무엇을하고 싶습니까? – puhlen

+0

또한 Employer를 country 필드가있는 클래스로 정의했지만 Employee와 함께 사용하려고 시도하고 있습니다. 오타라고 가정합니다. 혼동을 피하기 위해 수정하십시오. – puhlen

답변

1

반환 형식 주석을 메서드에 추가해야합니다. 반환되는 형식이 무엇인지 분명히하고 유형 변경이 유추 관리자에게 맡기지 않고 형식을 강하게 제어하도록 도와줍니다. 당신이하려고하는 것은 훨씬 더 중요하게됩니다.

예 1에는 몇 가지 문제가 있습니다. 먼저 값을 반환하지 않으므로 반환 유형은 원하는 것이 아닌 Unit입니다. val res =을 제거하여지도의 결과를 반환하십시오. 반환 유형을 추가 한 경우 컴파일러에서이 값을 캐치 할 수 있습니다. RDD 직원이 직원이 아닌 경우도 처리하지 못하면 그 경우 수행 할 작업에 대해 생각해 볼 필요가 있습니다 (해당 레코드를 필터링하거나 defautl 값을 입력하는 것이 합당한 옵션이지만, 다른 사람. 당신이 더 일반적인 유형을 원하기 때문에 예 2에서

, 당신은

def example2(data: RDD[(String, Int, List[Employer])]): RDD[((String, Int), List[Person])] = data.map { x => ((x._1, x._2), x._3)} 

고용주가 사람의 하위 유형입니다. 확인 또는 주조 모든 종류의 작업을 수행 할 필요가 없습니다, 그리고 목록은 공변입니다, List [Employer]는 List [Person]의 하위 유형이므로 List [Person]이 필요한 모든 위치에서 List [Employer]를 사용할 수 있습니다.

+0

그런 세부 정보를 제공해 주셔서 감사합니다. 나는 실제 코딩에서 모든 문제를 해결했다. – sk1007

0

def getType1(data: RDD[(String, Int, Person)]) : RDD[((String, Int),Person)] = { 
    data.map { case (s, i, person) => ((s, i), person)} 
} 
관련 문제