Scala:较低类型绑定A而不是B.

时间:2014-04-22 22:49:12

标签: scala

我想实现这个目标:

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;?

1 个答案:

答案 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

}