3

動的型を返すメソッドを作成するにはどうすればよいですか (できれば)

何かのようなもの

public X createRequestObject(Class xclass , String url , String username , String password){
   X x = Class.forName(xclass.getCannonicalName()).getConstructor(String.class).newInstance(url);
   x.setheader("AUTHORIZATION" , createHeader(username,password)
   return x
}

そして、私はそれを次のように使用できます

HttpGet httpGet = createRequestObject(HttpGet.class , "http://wwww.google.com , "username","password");

or 

HttpPost httpPost = createRequestObject(HttpPost.class , "http://wwww.google.com , "username","password");

オブジェクトを返して後でキャストできることは知っていますが、キャストが嫌いなので、これを行うのに役立つ構造がJavaにあるかどうか疑問に思っています

4

5 に答える 5

13

メソッドをジェネリックとして宣言し、その戻り値の型とそのクラスを宣言するだけです。

public <T> T foo(Class<T> clazz, Object... args) {
    return null;
} 

明らかに、パラメーターは必要なものとは異なります。次の方法で新しいインスタンスを作成できますT

clazz.newInstance();

nullary コンストラクタの場合。

引数を持つコンストラクターの場合 (この例では String s と Object o):

return x.getConstructor(String.class, Object.class).newInstance("s", new Object());

実際、varargs のおかげで、配列を反復処理して、コンストラクター ルックアップに必要なすべてのクラス オブジェクトを取得できます。

その後、安全に行うことができます:

String s = foo(String.class, "a", "b");

T を使用のサブクラスに制限するHttpRequest場合:

public <T extends HttpRequest> T foo(Class<T> clazz, Object... args)
于 2013-08-16T15:00:50.373 に答える
2

このような状況では、ファクトリ パターンの利用を検討してください。

ファクトリの実装は、必要なタイプのリクエストを受け取り、必要なタイプのリクエストを提供できます。

ファクトリ メソッド パターンは、ファクトリの概念を実装するためのオブジェクト指向の作成設計パターンであり、作成されるオブジェクトの正確なクラスを指定せずにオブジェクト (製品) を作成する問題を処理します。

これは、あなたがやろうとしていることとまったく同じように聞こえます。

于 2013-08-16T15:06:49.270 に答える
1

ジェネリックを探しています:

public <T extends HttpRequest> T createRequest(Class<T> xclass, ...)
于 2013-08-16T15:01:07.143 に答える
0

このようなことができます

public <T> T createRequestObject(Class<T> cls, String arg) {

    return TypeT;
}
于 2013-08-16T15:03:08.947 に答える
0

試す:

public <X> createRequestObject(Class xclass , String url , String username , String password){

}

また

public <? extends someSuperclass>  createRequestObject(Class xclass , String url , String username , String password){


}

戻り値の型を、定義したスーパークラスのサブクラスに制限します。

于 2013-08-16T15:02:02.227 に答える