作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
trait Foo
trait Bar extends Foo
def doStuff[T <: Foo](x: T)(implicit ev: T =!:= Foo) = x
doStuff(new Foo{}) //ambiguous implicit value
doStuff(new Bar)// successful
def typeSafeSum[T <: Nat, W <: Nat, R <: Nat](x: T, y: W)
(implicit sum: Sum.Aux[T, W, R], error: R =:!= _7) = x
typeSafeSum(_3, _4)
最佳答案
在这个(和大多数其他)实例中,一个简单的类型类会比类型不等式测试更好。
想必是想排除的原因Foo
是Bar
(及其兄弟)有一些属性 Foo
缺乏。如果是这种情况,那么您应该创建一个类型类来捕获这些属性,并将其作为 doStuff
的类型参数的要求。 .您可以使用 Scala 的 @implicitNotFound
注释以使编译器错误消息在不满足该要求时更易于理解。
@annotation.implicitNotFound(msg = "No Props instance for ${T}")
trait Props[T] {
def wibble(t: T): Double
}
trait Foo
// Note no Props instance for Foo ...
trait Bar extends Foo
object Bar {
// Props instance for Bar
implicit def barProps: Props[Bar] = new Props[Bar] {
def wibble(t: Bar): Double = 23.0
}
}
def doStuff[T <: Foo](t: T)(implicit props: Props[T]) = props.wibble(t)
scala> doStuff(new Foo {})
<console>:11: error: No Props instance for Foo
doStuff(new Foo {})
^
scala> doStuff(new Bar {})
res1: Double = 23.0
Foo
来自
Bar
那么你应该质疑你的假设,你需要排除
Foo
来自
doStuff
首先。
=!:=
(和 Scala 自己的
=:=
)只是作为最后的手段,如果有的话。
关于scala - 不明确的隐式值是我们想让错误在编译时存在的唯一方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24926521/
我是一名优秀的程序员,十分优秀!