alb*_*jan 2 generics types scala
我有这个功能:
def unpack[T] = (x:Option[T], y:T) => x match { case Some(z) => z; case None => y }
Run Code Online (Sandbox Code Playgroud)
当我这样称呼时:
unpack(Some(1), 2)
Run Code Online (Sandbox Code Playgroud)
结果如预期:
res5: Int = 1
Run Code Online (Sandbox Code Playgroud)
但当我用明显错误的东西称它时:
unpack(Some("1"), 2)
Run Code Online (Sandbox Code Playgroud)
结果是:
res6: Any = 1
Run Code Online (Sandbox Code Playgroud)
据我所知,它不能推断出结果类型,它返回一个AnyRef/Val.
但是为什么不抛出我在函数中明确指出的错误Option,即默认值和默认值都是类型T.
函数定义也清楚地表明结果将是类型T:
unpack: [T]=> (Option[T], T) => T
Run Code Online (Sandbox Code Playgroud)
这是工作中的Scala类型推断.在给定的例子,它试图找到共同的超类型String和Int,这是Any
考虑更深层次的层次结构:
trait Veggy
object tomato extends Veggy
trait Fruit extends Veggy
trait Orange extends Fruit
trait BloodOrange extends Orange
trait Apple extends Fruit
Run Code Online (Sandbox Code Playgroud)
然后
unpack(Some(tomato), new Orange{}) // Veggy
unpack(Some(new Apple{}), new Orange{}) // Fruit
unpack(Some(new BloodOrange{}), new Orange{}) // Orange
Run Code Online (Sandbox Code Playgroud)
您想确保两个参数的类型完全相同吗?然后你需要告诉编译器.
一种可能的方式是说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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |