のサブタイプである形質またはミックスインと汎用的なクラスを作成する方法がありますです:私は他のタイプに余分なデータを添付して、に似た特性を持つようにしようとしているタイプのパラメータ
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: error: class type required but T found class WithExtraDataT extends T with ExtraData{ ^ :12: error: illegal inheritance; supertype T is not a subclass of the superclass Object of the mixin trait ExtraData class WithExtraDataT extends T with ExtraData{
// 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: warning: a pure expression does nothing in statement position; multiline expressions may require enclosing parentheses self : T => t ^ defined class WithExtraData
scala> new WithExtraData[String]("hi", new ArrayByte) :13: error: class WithExtraData cannot be instantiated because it does not conform to its self-type WithExtraData[String] with String
がありますこれを達成する方法?
私はあなたが合理的に(少なくともマクロなし)を取得することができます最も近いExternalType1
を拡張するために、代わりに暗黙の型変換を持つことはないと思われる
私はあなたが重要な要件を省略していることを推測していますを使用することです。このインスタンスをいくつかの外部ライブラリに渡すことができるように 'ExternalType1'を拡張しようとしていますか?それを戻して、' ExtraData'にキャストし、 'getExtraData'にキャストしますか?そうでない場合は、間違いなくサブクラス化から離れるべきです。 – drstevens
はい、私はそれに似た何かをしようとしていますが、Kryoにはカスタムシリアライザがあります。 –