2017-01-07 7 views
-1

スカラ継承の検査私は誤解にぶつかります。
コードは次のとおりです。スカラサブクラスからスーパークラスオブジェクトへの代入

sealed trait List[+A] // `List` data type, parameterized on a type, `A` 
case object Nil extends List[Nothing] // A `List` data constructor representing the empty list 
case class Cons[+A](head: A, tail: List[A]) extends List[A] 

object List { // `List` companion object. Contains functions for creating and working with lists. 
    def sum(ints: List[Int]): Int = ints match { // A function that uses pattern matching to add up a list of integers 
    case Nil => 0 // The sum of the empty list is 0. 
    case Cons(x,xs) => x + sum(xs) // The sum of a list starting with `x` is `x` plus the sum of the rest of the list. 
    } 

    def product(ds: List[Double]): Double = ds match { 
    case Nil => 1.0 
    case Cons(0.0, _) => 0.0 
    case Cons(x,xs) => x * product(xs) 
    } 

    def apply[A](as: A*): List[A] = // Variadic function syntax 
    if (as.isEmpty) Nil 
    else Cons(as.head, apply(as.tail: _*)) 
} 

val l1 = List(1.0, 2.0, 3.0) 
println(product(l1)) 

私の知る限り理解しList[+A]Cons[+A]関係はList[+A]Cons[+A]List[+A]のサブクラスである、スーパー「クラス」であるということです。

l1は、Con[+A]のインスタンスです。
l1productメソッドに渡され、入力パラメータdsはサブクタConsについては何も知らないタイプListを持ちます。

したがって、サブクラスオブジェクトのスーパークラスオブジェクトへの割り当てはどのように説明できますか?

+1

'/スーパークラスオブジェクト/ /スーパークラス型/'のパラメータへ。 OOPの経験はありますか? –

+0

サイドノート: 'Cons Cons(0.0、_)=> 0.0'はIEEE-754に反する。反例は '0.0 * Double.NaN'であり、これは' Double.NaN'と評価される。 – Jubobs

+0

@ Victor Moroz、私はそう思った。しかし、特定の例が私にとってはっきりしていないので、私はここにいる。 –

答えて

0

Consの追加のメソッドは、List型の変数に代入すると単純に非表示になります。 Animalはすべて(おそらく)動くことができますが、extends Animalも牛乳を与えるCowです。タイプCowのオブジェクトをタイプAnimalの変数に割り当てると、.moveのみを呼び出すことができますが、.give_milkは呼び出すことはできません。それでもまだ内部にCowです。

関連する問題