gpt4 book ai didi

scala - Scala 中的类型 - 下界

转载 作者:行者123 更新时间:2023-12-03 23:54:17 25 4
gpt4 key购买 nike

下面的代码。

我的期望是 T 必须是 BA 类型的 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

在哪里 AnyRef是所有对象/引用类型的父类(super class)型(实际上它是 Java Object 类的别名)。这是正确的,T >: B表示类型参数T或抽象类型 T引用 B 类型的父类(super class)型.

toString 只是一个不好的例子, 因为这个方法有所有的对象类型,但是如果你把它改成,比如说 someMethod , 你的 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 的子类,比一切都好,因为这paramsomeMethod方法:

def lowerBound[T <: B](param: T) = { param.someMethod }

关于scala - Scala 中的类型 - 下界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19217349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com