gpt4 book ai didi

scala - 为什么 scala 返回一个 Any(Val/Ref) 当函数显然是用错误的类型调用时

转载 作者:行者123 更新时间:2023-12-02 08:16:03 25 4
gpt4 key购买 nike

我有这个功能:

def unpack[T] = (x:Option[T], y:T) => x match { case Some(z) => z; case None => y }

当我这样调用它时:

unpack(Some(1), 2) 

结果符合预期:

res5: Int = 1

但是当我用明显错误的东西调用它时:

unpack(Some("1"), 2)

结果是:

res6: Any = 1

我知道它无法推断结果类型,它返回一个 AnyRef/Val

但是为什么不报错我在函数中明确指定Option和default都是T类型。

函数定义也明确指出结果将是 T 类型:

unpack: [T]=> (Option[T], T) => T

最佳答案

这是工作中的 Scala 类型推断。在给定的示例中,它试图找到 StringInt 的公共(public)父类(super class)型,即 Any

考虑更深层次的类型层次结构:

trait Veggy
object tomato extends Veggy
trait Fruit extends Veggy
trait Orange extends Fruit
trait BloodOrange extends Orange
trait Apple extends Fruit

然后

unpack(Some(tomato), new Orange{}) // Veggy
unpack(Some(new Apple{}), new Orange{}) // Fruit
unpack(Some(new BloodOrange{}), new Orange{}) // Orange

您想确保两个参数的类型完全相同吗?然后你需要告诉编译器。

一种可能的方式是说 xy 各有一个类型,并且应该有证据表明这两个类型是相同的:

def unpack[T,U <:T ](x:Option[T], y:U)(implicit ev: T =:= U) : T = x match { case Some(z) => z; case None => y }

unpack(Some(new Fruit{}), new Orange{})
<console>:12: error: Cannot prove that Fruit =:= Orange.

unpack(Some(1), 2) // Int = 1

关于scala - 为什么 scala 返回一个 Any(Val/Ref) 当函数显然是用错误的类型调用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41779894/

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