Scala 中的类型 - 下界

2024-03-18

在下面的代码上。

我的期望是T必须是 a 类型B or A,所以请致电lowerBound(new D)可能不应该编译(?)。类似的上限实验给了我预期的类型检查错误。

感谢您提供提示。

object varianceCheck {
  class A {
    override def toString = this.getClass.getCanonicalName
  }

  class B extends A
  class C extends B
  class D extends C

  def lowerBound[T >: B](param: T) = { param }

  println(lowerBound(new D))                      //> varianceCheck.D
}

通过您的实现,您可以编写:

scala>   def lowerBound[T >: B](param: T) = { param }
lowerBound: [T >: B](param: T)T

scala> lowerBound(new AnyRef {})
res0: AnyRef = $anon$1@2eef224

where AnyRef是所有对象/引用类型的超类型(实际上它是Java的别名Object班级)。这是正确的,T >: B表示类型参数T或抽象类型T引用类型的超类型B.

你只是有一个坏例子toString,因为这个方法具有所有对象类型,但是如果你将其更改为,让我们说someMethod, your lowerBound不会编译:

<console>:18: error: value someMethod is not a member of type parameter T
       def lowerBound[T >: B](param: T) = { param.someMethod }

如果你将其更改为T <: B,这意味着参数类型T是一个子类B,比一切都好,因为这个param has someMethod method:

def lowerBound[T <: B](param: T) = { param.someMethod }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中的类型 - 下界 的相关文章