gpt4 book ai didi

scala - 返回存在类型有意义吗?

转载 作者:行者123 更新时间:2023-12-01 09:50:03 26 4
gpt4 key购买 nike

如果我定义一个返回存在类型的方法:

trait X[T] {
def hello(x: T):Unit = println(x)
}

def myX: X[_] = new X[Any] {}

如果我调用 myX,我将得到一个类型为 X[_] 的值,但我不能向它传递任何内容:

val y: Any = 123
myX.hello(y) // compilation error!

我唯一能做的就是传递一个Nothing:

val y: Nothing = ???
myX.hello(y) // compilable, but useless

所以方法返回存在类型没有意义吗?

最佳答案

scala> trait X[T] {
| def hello(x: T):Unit = println(x)
| }
defined trait X

你的函数定义:

scala> def myX: X[_] = new X[Any] {}
myX: X[_]

scala> val xnothing = myX
xnothing: X[_] = $anon$1@5c44c582

scala> xnothing.hello(1)
<console>:14: error: type mismatch;
found : Int(1)
required: _$1
xnothing.hello(1)
^

同一函数的“固定”定义 - 正确捕获类型 arg:

scala> def myY[T]: X[T] = new X[T] {}
myY: [T]=> X[T]

如果未传递通用 arg,则推断为 Nothing

scala> val ynothing = myY
ynothing: X[Nothing] = $anon$1@53f0a4cb

您可以显式传递通用参数。

scala> val yint = myY[Int]
yint: X[Int] = $anon$1@555cf22

显然 Int 不是 Nothing

scala> ynothing.hello(1)
<console>:14: error: type mismatch;
found : Int(1)
required: Nothing
ynothing.hello(1)
^

这显然有效,因为我们显式传递了 Int:

scala> yint.hello(1)
1

现在这是一个有趣的部分。它之所以有效,是因为 Scala 可以计算出通用 arg 是 Int(来自用法)。将其与上面的 ynothing 定义及其调用 ynothing.hello(1) 进行对比,后者不编译。

scala> myY.hello(1)
1

关于scala - 返回存在类型有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978701/

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