我想实现这个目标:
implicit def aConvertable(obj: A): B = new B(obj)
implicit def aConvertableWithoutB[T <: A without B](obj: T): C = new C(obj)
正确的说法是什么:&#34; A没有B&#34;?
答案 0 :(得分:1)
我假设B是A的子类型。诀窍是引入一个适用于所有A的隐式“AllowedConversion”特征,然后是两个具有相同类型的B的隐式实例,这样它们就是B模糊不清:
object Foo {
trait A
class B(a: A) extends A
class C(a: A)
class AllowedConversion[T]
implicit def allowedForAs[T<:A] = new AllowedConversion[T]
implicit def contradictoryForBs[T <: B] = new AllowedConversion[T]
implicit def contradictoryForBs2[T <: B] = new AllowedConversion[T]
implicit def aConvertable(obj: A): B = new B(obj)
implicit def aConvertableWithoutB[T <: A](obj: T)(implicit allowed: AllowedConversion[T]): C = new C(obj)
// error!
// new B(new A{}):C
// ok!
new A{}:C
}