4

継承されたクラスをシリアル化するためのデフォルトのメソッドを提供したいインターフェースがあります。JsonSerializer<T>クラスを使用してシリアル化を行います。

メソッドは次のようになります。

public interface A
{
    public default String write()
    {
        new JsonSerializer</*Inherited class type*/>();
        // I've tried new JsonSerializer<this.getClass()>();  - Doesn't work

    }
}

public class AX implements A
{
}

したがって、AX をインスタンス化するときは、書き込みメソッドを使用して AX をシリアル化したい

AX inst = new AX();
String instSerialized = inst.write();

A の書き込みメソッドに AX の型を渡す必要があります。これは可能ですか?

4

3 に答える 3

1

インターフェイスでジェネリックを使用する

public interface A<T> {

    public default String write() {
        new JsonSerializer<T>();
        // I've tried new JsonSerializer<this.getClass()>();  - Doesn't work
    }
}

public class AX implements A<AX> {
}
于 2014-04-02T06:12:40.860 に答える
1

ジェネリック機構の型パラメーターは、コンパイル時の情報のみです。この型情報はバイトコードで消去されます。

オブジェクトの正確なクラス タイプ ( で取得できますgetClass()) は、ランタイム情報です。

結論: 静的型名はジェネリック括弧内にのみ配置できるため、そこでランタイム呼び出しを行う方法はありません。

シリアライザーをある程度共変にする唯一の方法は、次のように書くことです

new JsonSerializer<? extends A>() ...

しかし、本当の質問は次のとおりです。何を達成しようとしていますか? あなたのアプローチはあなたの問題を解決しないと思います。

于 2014-04-02T06:09:50.933 に答える