【发布时间】:2017-05-04 20:51:07
【问题描述】:
我正在尝试将额外数据附加到其他类型,并且具有类似于以下的特征:
trait ExtraData {
def getExtraData() : Array[Byte]
}
我目前正在这样使用它:
class ExternalType1WithExtraData(superType:ExternalType1, bytes:Array[Byte]) extends ExternalType1(superType.a,superType.b, ...) with ExtraData {
def getExtraData() : Array[Byte] = bytes
}
class ExternalType2WithExtraData(superType:ExternalType2, bytes:Array[Byte]) extends ExternalType2(superType.z,superType.w, ...) with ExtraData {
def getExtraData() : Array[Byte] = bytes
}
似乎有一种通用的方法可以创建这些类,但我还没有找到。
--- 开始编辑 -- 添加所需的行为
给定一个函数
def sendData(ex : ExternalType1)
我希望能够将我的增强类型传递给该函数。
val data:ExternalType1 = ???
val moredata:ExternalType1 = { new ExternalType1 with ExtraData{...} }
sendData(moredata)
--- 结束编辑
我试图按照这些思路做事,但没有成功:
// Compiler wont let me extend T
class WithExtraData[T](bytes:Array[Byte]) extends T with ExtraData{
def getExtraData() : Array[Byte] = bytes
}
:12: 错误:需要类类型但找到 T 类 WithExtraDataT 使用 ExtraData{ 扩展 T ^ :12: 错误:非法继承; T超型 不是超类 Object 的子类 混合特性 ExtraData Class WithExtraDataT 用 ExtraData 扩展 T{
// Seems closer, but doesn't work.
class WithExtraData[T](t:T, bytes:Array[Byte]) extends ExtraData {
this : T => t
def getExtraData() : Array[Byte] = bytes
}
:13: 警告:纯表达式在语句位置不执行任何操作;多行表达式可能需要括号 自我:T => t ^ 定义类WithExtraData
scala> new WithExtraData[String]("hi", new ArrayByte) :13: 错误:无法实例化类 WithExtraData,因为它不符合其自身类型 WithExtraData[String] with String
有没有办法做到这一点?
【问题讨论】:
-
我猜你忽略了一个重要的要求。您是否尝试扩展
ExternalType1,以便可以将此实例传递给某个外部库,将其取回,转换为ExtraData,然后转换为getExtraData?如果没有,你绝对应该远离子类化。 -
是的,我正在尝试做一些与此非常相似的事情,但对 Kryo 使用自定义序列化程序。
标签: scala generics traits scalaz type-constructor