在下面的代码上。
我的期望是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(使用前将#替换为@)