0

ジェネリック オブジェクトを受け取り、別のジェネリック オブジェクト (元のクラスと同じかサブクラス) を返すメソッドのシグネチャは何ですか? つまり、メソッドがジェネリック クラスAを使用する場合、返されるオブジェクトは(直接的または間接的に) 次のいずれAかであることが保証されます。BB extends A

以下のコードは、関数で私がやろうとしていることを例示していますgetList():

package com.company;
import java.util.ArrayList;

public class Main {
    private Main(){
         List<String> stringList = new GenericMessageListCreator.getList(StringGenericMessage.class);
    }

    private class GenericMessageListCreator() {
        public List<GenericMessage<T1>> getList(Class<T1 extends GenericMessage> clazz) {
            return new ArrayList<T1>();
        }
    }

    private class GenericMessage<T> {
        public GenericMessage(){};
        private T internalValue;

        public void setValue(T value) {
            this.internalValue = value;
        }

        public void echoValue() {
            System.out.println("I contain " + internalValue);
        }
    }

    private class StringMessage extends GenericMessage<String>{}
    private class IntegerMessage extends GenericMessage<Integer>{}
}

例はさておき、実際にはCommand、コマンド パターンで s に使用されるクラスのレジストリを作成しています。Commandクラスごとにオブジェクトを取得したら、適切なものをフェッチしてオブジェクトを渡したいと思います。

4

2 に答える 2

2

この署名を探していると思います:

public <T1 extends GenericMessage> List<GenericMessage<T1>> getList(Class<T1> clazz) {
    return new ArrayList<T1>();
}

ジェネリック メソッドの詳細については、こちらを参照してください。

編集

あなたのサンプルコードから私が理解したことに基づいて、私は次のようなものに行きます(あなたのコードのいくつかの構文エラーを修正しました):

private class GenericMessageListCreator {
    public <U, V extends GenericMessage<U>> List<U> getList(Class<V> clazz){
        return new ArrayList<U>();
    }
}

private class GenericMessage<T> {
    public GenericMessage(){};
    private T internalValue;

    public void setValue(T value)
    {
        this.internalValue = value;
    }

    public void echoValue() {
        System.out.println("I contain " + internalValue);
    }
}

private class StringMessage extends GenericMessage<String>{}
private class IntegerMessage extends GenericMessage<Integer>{}

List<Stringしたがって、次のように from `StringMessageを作成できます。

List<String> stringList = new GenericMessageListCreator().getList(StringMessage.class);
于 2013-07-10T21:14:56.937 に答える
0

これをどのメソッドに適用したいのかさえわかりませんが、次のように仮定していますgetList()

private class GenericMessageListCreator() {
    public <T extends GenericMessage<?>> List<T> getList(Class<T> clazz) {
        return new ArrayList<T>();
    }
}
于 2013-07-10T21:40:15.277 に答える