我有几个类不是从任何超类派生的.他们都定义了大量相同的方法.例如,
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++背景,我正在尝试为每种类型实现模板编译的效果.
谢谢你的时间!
我个人更喜欢即兴多态性与类型类(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)
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |