在没有继承层次结构的scala中编写通用代码

use*_*819 4 generics scala

我有几个类不是从任何超类派生的.他们都定义了大量相同的方法.例如,

class A {
    def getMsgNum = 1
}

class B {
    def getMsgNum = 2
}
Run Code Online (Sandbox Code Playgroud)

我想编写一个泛型函数,它将根据调用的对象函数返回消息num.所以,像,

def getMsgNum[T](t: T) = t.getMsgNum
Run Code Online (Sandbox Code Playgroud)

我认为,由于类型擦除,我不能指望它可以工作,但我正在查看与ClassTag绑定的视图绑定和上下文,但仍然无效.

def getType[T: ClassTag](msg: T) = {
    msg.getMsgNum
}
Run Code Online (Sandbox Code Playgroud)

我来自C++背景,我正在尝试为每种类型实现模板编译的效果.

谢谢你的时间!

Eug*_*nev 5

我个人更喜欢即兴多态性与类型类(http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html)模式.我认为对于这类问题,它将是更加"真正的scala方式"解决方案.结构类型在运行时也更昂贵,因为它使用反射进行字段访问.

  class A
  class B

  trait ToMsgNum[T] {
    def getMsgNum: Int
  }

  implicit object AToMsgNum extends ToMsgNum[A] {
    def getMsgNum = 1
  }

  implicit object BToMsgNum extends ToMsgNum[B] {
    def getMsgNum = 2
  }


  def getMsgNum[T: ToMsgNum](t: T) =
    implicitly[ToMsgNum[T]].getMsgNum

  println(getMsgNum(new A))
  println(getMsgNum(new B))
Run Code Online (Sandbox Code Playgroud)