在Scala对象中访问子类的方法时出现编译器错误

时间:2016-03-08 10:49:30

标签: scala

我有一个特点:

trait SomeTrait {
  def makeLulz: Unit = println("lulwot")
}

我有一个方法的另一个特性:

trait SomeTraitAlgorithm {
  def on[A >: SomeTrait](b: A): A
}

和我的对象扩展了SomeTraitAlgorithm

object AwesomeAlgorithm extends SomeTraitAlgorithm {
  override def on[A >: SomeTrait](a: A): A = {
    a.makeLulz // WOOAH, throws a compile error?
    ???
  } 
}

Isn' t ASomeTrait的子类?为什么编译器不知道doSomething

2 个答案:

答案 0 :(得分:3)

<:而非>:

object AwesomeAlgorithm extends SomeTraitAlgorithm {
  override def on[A <: SomeTrait](a: A): A = {
    a.makeLulz // WOOAH, throws NO compile error!
    ???
  } 
}

答案 1 :(得分:3)

你想要的是一个上层类型的界限。上限(<:)接受作为Type的子类的所有内容,而Lower-type bounds(>:)仅接受超类型。因此,如果您想从子类访问方法,则需要

object AwesomeAlgorithm extends SomeTraitAlgorithm {
    override def on[A <: SomeTrait](a: A): A = { 
        a.makeLulz //No compiler error, Yay!
    }
}

查看Upper Type BoundsLower Type Bounds上的网页。

如果您来自Java世界并且熟悉Generic Wildcards如何在那里工作,您可以将它们视为上层类型? extends SomeTrait和下层类型? super SomeTrait