gpt4 book ai didi

scala - 为什么 ListNode 示例(Scala 网站)可以处理不同的类型?

转载 作者:行者123 更新时间:2023-12-03 20:00:15 24 4
gpt4 key购买 nike

ListNode example ,取自 Scalas 主页是这样的:

case class ListNode[+T](h: T, t: ListNode[T]) {
def head: T = h
def tail: ListNode[T] = t
def prepend[U >: T](elem: U): ListNode[U] =
ListNode(elem, this)
}

使用这个类,我们可以创建如下对象:
val empty: ListNode[Null] = ListNode(null, null)
val strList: ListNode[String] = empty.prepend("hello")
.prepend("world")
val anyList: ListNode[Any] = strList.prepend(12345)

正如我们所见,我们可以在 String 前面加上一个整数值。节点。我猜,这是因为类型参数 U将自动设置为 Any ,当给 prepend 的整数时方法(因为 Int 不是 String 的父类(super class)型)。

当用自己的下限示例尝试这个时,我会得到一个错误:
scala> class E[T >: String]
defined class E

scala> new E[Any]
res1: E[Any] = E@135f0a

scala> new E[Int]
<console>:11: error: type arguments [Int] do not conform to class E's type param
eter bounds [T >: String]
val res2 =
^
<console>:12: error: type arguments [Int] do not conform to class E's type param
eter bounds [T >: String]
new E[Int]
^

为什么是类型 Int这里不会自动被视为类型 Any就像在 ListNode例子 ?

更新 1 :这也有效(没有明确说新的 ListNode 应该是类型 Any )
scala> val empty: ListNode[Null] = ListNode(null, null)
empty: example.listNode.ListNode[Null] = ListNode(null,null)

scala> empty.prepend("hello").prepend("world")
res0: example.listNode.ListNode[java.lang.String] = ListNode(world,ListNode(hell
o,ListNode(null,null)))

scala> val strList: ListNode[String] = empty.prepend("hello").prepend("world")
strList: example.listNode.ListNode[String] = ListNode(world,ListNode(hello,ListN
ode(null,null)))

scala> strList.prepend(12345)
res1: example.listNode.ListNode[Any] = ListNode(12345,ListNode(world,ListNode(he
llo,ListNode(null,null))))

最佳答案

您会收到上述错误,因为 Int不是 String 的父类(super class)型.

请注意,在 ListNode上面的代码,StringNull 的父类(super class)型(见 class hierarchy)和 AnyString 的父类(super class)型(正如您正确指出的那样)。

我猜想混淆是由比较两个并不完全相同的操作引起的:new E[Int]使用类型参数 Int 实例化类,这不符合下限 String因此失败。

ListNode上面的代码,另一方面,你调用 prepend采用父类(super class)型的方法 UT .创建时anyList , U是(正如您所猜测的)解析为 Any因为这是 String 唯一常见的父类(super class)型和 Int ,所以你可以认为它并没有真正通过 Int到它,但只是 Any 的一些任意实例(这也恰好是 Int 类型)。

所以,

val anyList: ListNode[Int] = strList.prepend(12345)

也失败,如 strList.prepend(12345)只能返回 ListNode[Any] .

关于scala - 为什么 ListNode 示例(Scala 网站)可以处理不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11280838/

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