使用implicits实现Trait时避免显式委派

时间:2015-09-22 22:19:36

标签: scala implicits

我正在使用这样的几个类:

class MyClassOne {
  doSomething(a : A) : B
  ... 
} 

class MyClassTwo {
  doSomething(a : A) : B
  ... 
} 

课程的来源不在我的掌控之中。尽管类具有相同签名的方法,但它们不实现接口。我想定义适用于所有类的方法。

所以我做了一个像这样的特质:

trait MyTrait {
  doSomething(a : A) : B
}

并为所有类进行了隐式转换:

implicit class MyClassOneMyTrait(myClassOne : MyClassOne) {
  def doSomething(a : A) = myClassOne.doSomething(a)
}

有没有办法利用类中使用的命名约定,并避免显式委托传递给构造函数的对象?更一般地说,使用具有隐式类的Trait是解决此问题的最佳方法吗?

1 个答案:

答案 0 :(得分:4)

实际上,scala功能完全适合您的情况。它被称为structural types

对于结构类型,类型要求由接口结构而不是具体类型表示。内部实现使用反射,因此具有性能意识!
type A = String
type B = String

class MyClassOne {
  def doSomething(a: A): B = {
    println("1")
    "1"
  }
}

class MyClassTwo {
  def doSomething(a: A): B = {
    println("2")
    "2"
  }
}

type MyClassType = {
  def doSomething(a: A): B
}

List[MyClassType](new MyClassOne, new MyClassTwo).foreach(_.doSomething("test"))
List(new MyClassOne, new MyClassTwo).foreach {
  case a: MyClassType => a.doSomething("test")
  case _ =>
}