2017-11-28 3 views
0

オブジェクトのすべてのフィールドを取得する汎用メソッドを作成する必要があります。このオブジェクトのクラスにはClassTagが含まれている可能性があります。いいやり方?難しさは私たちがクラスを先に知らないので、ClassTag(ゼロから多く)が含まれているかもしれませんが、そうでないかもしれません。例えばスカラはクラスインスタンスからclasstagを取得します

class A(x : Int) {} 

a = new A(1) 

我々は出力のx => 1

class B[T: ClassTag]() {} 

b = new B[Float]() 

我々は出力_ $ 1 =

答えて

1
def fields(obj: AnyRef) = obj.getClass.getDeclaredFields.map(field => (field.getName, field.get(obj)) 

フロートはあなたのペアの配列を与えるべきでなければなりませんフィールド名とそれに対応する値は、あなたが望むフォーマットにマッサージすることができます。 ClassTagがあるかどうかによって、型のテストや何かを行うことができます。

しかし、あなたの具体的な例について:AxBClassTagがフィールドですどちらも、彼らは、インスタンス内の任意の場所に保存されていないだけで、コンストラクタのパラメータです。これを変更するには、valとしてそれを宣言することができます。

class A(private val x: Int) 
class B[T]()(private val tag: ClassTag[T]) 

またはそれらは、コンストラクタの外のどこか体で使用されていることを確認してください。

+0

私はクラスを変更できない場合、私の質問は、クラスタグの値を取得する方法はまだあるのですか?シリアライズしているときにスカラー自体がどのように処理されているのかわかりません。 –

+0

私が言ったように、この特定の 'B'ではありません。そして、標準的なシリアライゼーションにも同様に適用されます: 'ClassTag'は最初にシリアライズするためのものではありません... –

関連する問題