2017-07-15 14 views
0

私はコードを自動生成するGoogleのprotobufライブラリを使用しています。あなたはPersonオブジェクトのPersonRequestを持っているのであれば、それは私のリクエストごとに、私はジェネリック、リフレクション、自動生成コードへのアクセス

XXXXXRequest.paseFrom(byte[] bytes) 

のように見えるいくつかのコードを持っているので、

PersonRequest.parseFrom(byte[] bytes) 

のようになりますそのあなたのためのコードを生成します私は何をしたい

public interface MyInterface<T> { 
    T parseFrom(byte[] bytes) 
} 

のようなインタフェースを記述し、その後、私は実装に何をすべきか本当にわからないです。それは行くのですか

public class MyInterfaceImpl<T> implements MyInterface<T> { 
    @Override 
    T parseFrom(byte[] bytes) { 
     return T.parseFrom(bytes); // what do I do here? 
    } 
} 

私はここで何をすべきか、私はここで何をすべきでしょうか?

+0

'PersonRequest.parseFrom(バイト[]バイト)'何を返すのでしょうか? – davidxxx

+0

@davidxxx PersonRequestを返します。基本的には、生のバイトから構築します。 – Crystal

+0

あなたは、リフレクションにあまり依存しないようにしようとしていることを行うために、ライブラリに組み込まれた方法を探しましたか? –

答えて

0

代わりに、あなたのインタフェース用に別の実装を作成するのではなく、あなたが直接パーサーメソッドを参照し、インターフェースのインスタンスを作成するためにそれを使用することができます。

MyInterface<PersonRequest> obj = PersonRequest::parseFrom; 
0

各生成されたクラスなど(PersonRequest、OtherClassRequest、 ..)は特定のクラスになります。
したがって、特定の生成クラスによって実装を定義する必要があります。これらの条件で

、両方のインタフェースおよびサブクラスのためにジェネリックを宣言する必要はありません。

public class MyInterfaceImpl<T> implements MyInterface<T> { 

あなただけMyInterfaceインタフェースのための一般的な必要があります。
あなたがそれを宣言する方法は大丈夫です。

次に、サブクラスは、実装する親クラスのジェネリック型を指定する必要があります。例えば

public class MyPersonRequestImpl implements MyInterface<PersonRequest> { 
    @Override 
    PersonRequest parseFrom(byte[] bytes) { 
     return PersonRequest.parseFrom(bytes); 
    } 
} 
+0

私がリフレクションを使いたい理由は基本的にすべてのクラスがすべてのメッセージタイプでこのように見えるからです。生成されたコードにはすべてPersonRequest.parseFrom(bytes)またはOtherRequest.parseFrom(bytes)があり、基本的にはメッセージタイプを持つクラスと同じ数のクラスを作成するのではなく、あるクラスを持つ方法があるかどうかを確認しようとしていました。自動生成コード。 – Crystal

関連する問題