作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个功能:
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 类型推断。在给定的示例中,它试图找到 String
和 Int
的公共(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
您想确保两个参数的类型完全相同吗?然后你需要告诉编译器。
一种可能的方式是说 x
和 y
各有一个类型,并且应该有证据表明这两个类型是相同的:
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/
我是一名优秀的程序员,十分优秀!