虽然这可以编译:
implicit class Container[T](val value:T) extends AnyVal{
def addInt(x:Int)(implicit ev:T=:=Int) = value+x
}
这会抱怨类型不匹配,预期T
,实际Int
,就好像忽略了类型绑定一样。
implicit class Container[T](val value:T=>Int) extends AnyVal{
def addInt(x:Int)(implicit ev:T=:=Int) = value(x)
}
为什么?
答案 0 :(得分:2)
实际上,你的类型约束是倒退的。 T =:= Int
提供了隐式证据,表明T
为Int
,但不完全 Int
为T
。如果您查看=:=
的声明,您会发现它只有一种方式:
sealed abstract class =:=[From, To] extends (From => To) with Serializable
您的第一个示例有效,因为value
是T
,约束是T =:= Int
,隐式地将T
转换为Int
。但是对于第二个示例,我们需要将T
提供给value: T => Int
,因此我们需要另一个方向。
这有效:
implicit class Container[T](val value: T => Int) extends AnyVal {
def addInt(x: Int)(implicit ev: Int =:= T) = value(x)
}
使用Int <:< T
的第二个示例也有效的原因是<:<
提供了Int => T
的隐式转换。
答案 1 :(得分:0)
哦可能问题是函数的反差。这现在有效:
<activity
android:name="Your_Activity"
android:configChanges="orientation"
android:screenOrientation="landscape" />