我有两个类,其中包含一些数据成员,如下所示:
class MyInfo {
private val myId: String
private val time: DateTime
private val solution: Long
private val banner: Int
}
Class HisInfo {
private val id: String
private val solution: Long
private val banner: Int
}
如您所见,这两个类共享两个成员,而在我的真实项目中,它们共享更多的成员。我需要将它们保存到hbase中,并设计一个这样的类:
sealed trait Element[T] {
def serialize(value: T)(implicit val helper: Helper[T]): Array[Byte]
def deserialize(bytes: Array[Byte])(implicit val helper: Helper[T]): T
}
case object LongElement extends Element[Long] {...}
case object IntElement extends Element[Int] {...}
class Info {
protected val data: Map[Element[_], Any] = new mutable.Map[Element[_], Any]()
}
class MyInfo extends Info {
val elements = List(LongElement, IntLement)
def saveToHBase = {
elements.foreach { e =>
val v = e.serialize(data(e))
// do sth with v
}
}
实际上,我已经定义了Helper [Int]和Helper [Long]的实现,但是编译器抱怨它找不到参数Helper [_1]的隐式值。有人可以帮我设计这些课程吗?
实际上,我已经定义了Helper [Int]和Helper [Long]的实现,但是编译器抱怨它找不到参数Helper [_1]的隐式值。
好吧,考虑一下如果elements
包含Element[String]
(或其他没有隐式类型的)类型会发生什么Helper
。给定的类型elements
,编译器无法知道不是。
我认为,如果无论如何Helper
都需要a的所有方法Element
,则应使其成为该类型的一部分:
sealed trait Element[T] {
val helper: Helper[T] // or def if you want to put it in the companion object
def serialize(value: T): Array[Byte]
def deserialize(bytes: Array[Byte]): T
}
或者
sealed abstract class Element[T](implicit val helper: Helper[T]) {
def serialize(value: T): Array[Byte]
def deserialize(bytes: Array[Byte]): T
}
至少在大多数情况下。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句