0

次のように抽象基本クラスを作成しました。

abstract class parent

次に、先に進み、親クラスを継承する2つのケースクラスを作成しました。

case class child1(name:String,category:String) extends parent

case class child2(name:String,category1:String,category2:String) extends parent

次に、キックのために、親タイプのリストを作成し、それにchild1とchild2を追加しました。

val childList = List[parent]()

scala> child1("Child","One") :: child2("Child","Two","dhshs")::childList
res2: List[parent] = List(child1(Child,One), child2(Child,Two,dhshs))

これまでのところ、List[Parent]には2つの子タイプが含まれています。

ここで、リストをトラバースし、子の基になるタイプに基づいて、その特定のタイプに対して特別なことを行います。だから私はこれを行います:

scala> res2 map {case child1 => "Child1";case child2 => "Child2"}

私は、を見ると思っていましたList[String]("Child1","Child2")が、代わりに次のようになりました。

<console>:15: error: unreachable code
              res2 map {case child1 => "Child1";case child2 => "Child2"}

さて、もう少しキックするために、私は次のことをしました:

scala> res2 map {r => r match {case child1 => "Child1"}}
res8: List[java.lang.String] = List(Child1, Child1)

scala> res2 map {case child1 => "Child1"}
res9: List[java.lang.String] = List(Child1, Child1)

ご覧のとおり、リストエントリとして「Child1」を取得しました。「child2」の場合でも、Child1を取得します。

かなり混乱しています、誰かがここで何が起こっているのか教えてもらえますか?

4

1 に答える 1

4

問題はここにあります:child1とchild2は、結果を格納するために作成された新しい変数です。

res2 map {case child1 => "Child1";case child2 => "Child2"}

これを試して:

res2 map {case x:child1 => "Child1";case y:child2 => "Child2"}

xおよびyは、それぞれ関連するタイプchild1およびの変数child2です。

于 2013-01-29T05:36:54.430 に答える