这是工作中的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
然后
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{}):12: error: Cannot prove that Fruit =:= Orange. unpack(Some(1), 2) // Int = 1