2017-04-12 7 views
0

拡張クラスから基本クラスを取得する方法。実際、私はScalaで新しく、密閉されたtraitクラスを使用していくつかのコーディングを作成しようとしています。例えばScalaで密閉された特性クラス変換

、私は1つの密閉トレイルクラス密封トレイルクラスに拡張いくつかのケースクラスを有しています。

例:例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) 
     ) 
     } 
    } 
} 

が、どのように逆を行うにはタイプ2の場合? 私のプロジェクトを理解するのに役立つ例がありますので、私に提案してください。

+0

最初の例は安全ではないことに注意してください。人が従業員でない場合は、実行時に例外が発生します。あなたは代わりに雇用者を持っているレコードで何をしたいですか? – puhlen

+0

また、Countryフィールドを持つクラスとしてEmployerを定義しましたが、Employeeと一緒に使用しようとしていますが、これは誤植と見なします。混乱を避けるために修正してください。 – puhlen

答えて

1

戻り値の型の注釈をメソッドに追加する必要があります。戻り値の型が明確であることを確認し、型の変更が大きな部分を占めるので、型を推測者に任せずに型を制御します。あなたがしようとしていることがさらに重要になります。

あなたのexample1にはいくつかの問題があります。まず、値を返さないので、戻り値の型はあなたが望むものではありません。地図の結果を返すように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)} 

、雇用者は、人のサブタイプである、とリストは共変ですそう一覧[雇用者]はリストのサブタイプ[人]であるので、あなたはリスト[雇用者]の任意の場所一覧[人]が必要ですを使用することができます。

+0

このような詳細をお寄せいただきありがとうございます。私はすべての問題を実際のコーディングで修正しました。 – sk1007

0

ような何か

def getType1(data: RDD[(String, Int, Person)]) : RDD[((String, Int),Person)] = { 
    data.map { case (s, i, person) => ((s, i), person)} 
} 
関連する問題