Max*_*Max 3 generics scala type-bounds
在下面的代码上。
我的期望是它T必须是 a 类型Bor 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
}
Run Code Online (Sandbox Code Playgroud)
通过您的实现,您可以编写:
scala> def lowerBound[T >: B](param: T) = { param }
lowerBound: [T >: B](param: T)T
scala> lowerBound(new AnyRef {})
res0: AnyRef = $anon$1@2eef224
Run Code Online (Sandbox Code Playgroud)
whereAnyRef是所有对象/引用类型的超类型(实际上它是 JavaObject类的别名)。这是正确的, T >: B表示类型参数T或抽象类型T引用type的超类型B。
你只是有一个不好的例子toString,因为这个方法有所有的对象类型,但是如果你把它改成 on someMethod,你lowerBound就不会编译:
<console>:18: error: value someMethod is not a member of type parameter T
def lowerBound[T >: B](param: T) = { param.someMethod }
Run Code Online (Sandbox Code Playgroud)
如果将其更改为T <: B,这意味着类型的参数T是 的子类B,那么一切都很好,因为它param具有someMethod方法:
def lowerBound[T <: B](param: T) = { param.someMethod }
Run Code Online (Sandbox Code Playgroud)