2

私は型付きコレクションでジェネリックを使用することに慣れていますが、実際にジェネリックを使用して何かを開発したことはありません。

私はこのようないくつかのクラスを持っています:

public class LogInfoWsClient extends GenericWsClient {
    public void sendLogInfo(List<LogInfo> logInfoList) {
        WebResource ws = super.getWebResource("/services/logInfo");
        try {
            String response = ws.accept(MediaType.TEXT_HTML).type(MediaType.APPLICATION_XML).put(String.class, new GenericEntity<List<LogInfo>>(logInfoList) {
            });     
    }
}

相互に異なるのは、サービス文字列 (「/services/info」) とリストのタイプ (この場合は LogInfo) だけです。

いくつかのメソッドを GenericWsClient クラスにリファクタリングしましたが、私の目的は、次のように使用できるものを用意することです。

List<LogInfo> myList = database.getList();
SuperGenericClient<List<LogInfo>> superClient = new SuperGenericClient<List<LogInfo>>();
superClient.send(myList,"/services/logInfo");

しかし、私はそれを行う方法を理解することはできません。それは可能でしょうか?

4

3 に答える 3

1

はい、実際にはjava.util.collectionパッケージを見ると、すべてのクラスが parameterzid であることがわかります。

したがって、クラスは次のようになります

public SuperGenericClient<E> {       
    public E getSomething() {
         return E;
    }
}

次に、それを使用するには、

SuperGenericClient<String> myGenericClient = new SuperGenericClient<String>();
String something = myGenericClient.getSomething();

サンプル自体を拡張すると、コードは次のようになります。

public class SuperGenericClient<E> extends GenericWsClient {
    public void send(List<E> entityList, String service) {
        WebResource ws = super.getWebResource(service);
        try {
            String response = ws.accept(MediaType.TEXT_HTML).type(MediaType.APPLICATION_XML).put(String.class, new GenericEntity<E>(entityList) {
            });
        }            
    }
}

public class GenericEntity<E> {
    public GenericEntity(List<E> list){

    }
}

ジェネリックを十分に理解するには、これを読む必要があります。

于 2012-05-15T16:02:22.910 に答える
1

以下のようなクラスを書くことができます - 同じアイデアを に適用することができますGenericEntity

public class SuperGenericClient<T> extends GenericWsClient {

    public void send(List<T> list, String service) {
        WebResource ws = super.getWebResource(service);
        try {
            String response = ws.accept(MediaType.TEXT_HTML).type(MediaType.APPLICATION_XML).put(String.class, new GenericEntity<T>(list) {
            });
        }            
    }
}

その後、次のように呼び出すことができます。

List<LogInfo> myList = database.getList();
SuperGenericClient<LogInfo> superClient = new SuperGenericClient<LogInfo>();
superClient.send(myList,"/services/logInfo");
于 2012-05-15T16:03:06.557 に答える
1

次のようにクラスを宣言します。

public class LogThing<T> {
    public void sendLogInfo(List<T> list) {
        // do thing!
    }
}

そして、あなたがそれを使うときは、次のようにしてください:

List<LogInfo> myList = db.getList();
LogThing<LogInfo> superClient = new LogThing<LogInfo>();
superClient.sendLogInfo(myList);
于 2012-05-15T16:03:58.137 に答える