方法方差:插入具体元素后返回抽象超类型列表

时间:2014-10-14 14:56:52

标签: scala covariance contravariance

我正在为超类编写insertInOrder函数,但无法从方法中访问值age

abstract class Parent(age: Int)
case class Child1(age: Int) extends Parent(age)
case class Child2(age: Int) extends Parent(age)

def insertInOrder [U >: Parent] (x:  U, acc: List[U] ): List[U]  ;
// value age is not a member of type parameter U    

我试过了:

def insertInOrder [U >: Parent, U <: Nothing] (x:  U, acc: List[U] ): List[U]  = {
// U is already defined as type U   

我该怎么办?

3 个答案:

答案 0 :(得分:1)

在Parent非案例类中没有为age constructor参数创建getter / setter。所以添加&#39; val&#39; (也许&#39;受保护的val&#39;如果它不应该在派生类之外公开)。

一些例子和一个很好的总结: https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch04s03.html

答案 1 :(得分:1)

abstract class Parent(val age: Int)

将生成您正在寻找的吸气剂。

答案 2 :(得分:1)

在您的示例中,在抽象中定义的年龄不可访问,您需要在其前面添加val以便可以从Parent访问。但是,对于Child的案例类覆盖,您将遇到问题。你的U字型绑定也不正确。我建议你修改代码:

  trait Parent {
    def age: Int
  }
  case class Child1(age: Int) extends Parent
  case class Child2(age: Int) extends Parent

  def insertInOrder [U <: Parent] (x: U) = {
    println(x.age)
  }

  insertInOrder(Child1(10))