Scala上层类型绑定

时间:2015-06-25 17:05:55

标签: scala types type-bounds

class P(name: String)
class E(_name: String, role: String) extends P(_name)

def testF[T <: P](x: List[T]): List[T] = x

val le = List(new E("Henry", "Boss"))
class Test[R <: E](l: List[R]) {
  def r[O <: P] (): List[O] = testF(l)
}

我明白了:

Error:(8, 38) type mismatch;
 found   : List[R]
 required: List[O]
  def r[O <: P] (): List[O] = testF(l)

我的直觉表明这应该有效,因为T的上限类型比O更严格。

****编辑****

  def findNN[A, B <: A, C <: A, T] (seq: Seq[B], n: Int, center: C, distance: (A, A) => T)
  (implicit ord: Ordering[T]): Seq[B] = {
    import ord._
    val ds = seq map ( (a: A) => distance(a, center))
    val uds = ds.distinct
    //#TODO: replace quickSelect with median-of algorithm if necessary
    val kel = quickSelect(uds, n)
    val z = seq zip ds
    val (left, _) = z partition Function.tupled((_, d: T) => d <= kel)
    left map {t => t._1}
  }

好的,我们来看看上面的例子。

超类A提供方法距离。 我想在findNN上使用seq[B]函数,该函数具有类C中的中心。 distance应该有效,因为它适用于A

根据提供的反馈,无法简化上述类型签名。

2 个答案:

答案 0 :(得分:2)

你做错了,你需要&gt;而不是:&lt;

class P(name: String)
class E(_name: String, role: String) extends P(_name)
def testF[T >: P](): List[T] = List(new P("Henry"))

答案 1 :(得分:1)

您尝试使用类型参数R(上限类型为E)来限制结果的类型,而您在函数中未使用类型R

正确使用类型参数(带上限)的示例:

def testF[T <: P](list: List[T]): List[T] = list

testF(List(new P("Tom"))) 
// List[P] = List(P@43bc21f0)
testF(List(new E("Jerry", "Mouse")))
// List[E] = List(E@341c1e65)

不正确使用类型参数:

// does not compile, what is A ??
def foo[A]: List[A] = List("bar")