1

FooオブジェクトとBarオブジェクトのリストと、対応する各オブジェクトのコンバーターがあります。

public static void Convert(Foo1 a, Bar1 b) {
...
}
public static void Convert(Foo2 a, Bar2 b) {
...
}
etc

ただし、一部のオブジェクトにはリストが含まれています。
Bar1はBar2やBar3などとは大きく異なるため、Convert-methodsは異なる必要がありますが、すべての可能なリストを処理する1つのメソッドを作成したいと思います。

リストの内容に応じて、適切な非ジェネリックメソッドを呼び出すジェネリックメソッドを作成することは可能ですか?

これまで私はこれを試しました:

public static <T, S> void ConvertList(List<T> list, List<S> libList) {
    list = new ArrayList<T>(libList.size());

    for (int i = 0; i < libList.size(); ++i) {
        Convert(list.get(i), libList.get(i));
    }
}

しかし、「メソッド'Convert(T、S)'を解決できない」ため、コンパイルされません。

何か案は?

4

2 に答える 2

1

いいえ、これを行うことはできません-オーバーロードはコンパイル時に決定されます。関連するオブジェクトの実行時のタイプ、または少なくとも実行時のタイプに基づいて、さまざまなメソッドを呼び出す必要があるようです。のT、実行時に完全に不明です。

実行時のタイプに基づくコードパスの決定は、通常、オーバーロードによるオーバーライドによって処理されますが、この場合にこれが実行可能かどうかは明らかではありません。convert各サブクラスに適切なメソッドを配置できれば、Foo??制約が発生する可能性がTありますSが、基本的には、現時点で認識していないコンテキストが多すぎます。

リフレクションを使用して、実行時に最も適切なメソッドを見つけて呼び出すこともできますが、それはコーディングに手間がかかり、大幅に遅くなる可能性があります

于 2012-10-10T13:17:26.183 に答える
0

これを実現するには、ランタイムポリモーフィズムを使用する必要があります。

ステップ1:各タイプを表すインターフェイスを作成します。

public  interface Foo<T> {
    public void convert(T bar);
}
public interface Bar<T> {
    public void convert(T foo);
}

ステップ2:実装クラスを作成します。

public class Foo1 implements Foo<Bar1> {

    @Override
    public void convert(Bar1 bar) {
        System.out.println("Foo1, Bar1");
    }
}
public public class Bar1 implements Bar<Foo1> {

    @Override
    public void convert(Foo1 foo) {
        System.out.println("Foo1, Bar1");
    }
}
public class Foo2 implements Foo<Bar2> {

    @Override
    public void convert(Bar2 bar) {
        System.out.println("Foo2, Bar2");
    }
}
public class Bar2 implements Bar<Foo2> {

    @Override
    public void convert(Foo2 foo) {
        System.out.println("Foo2, Bar2");
    }
}

ステップ3:リスト内のインスタンスに従ってconvertメソッドを呼び出す関数を作成します。

public static <T extends Foo, S extends Bar> void convertList(List<T> list,
        List<S> libList) {

    for (int i = 0; i < libList.size(); ++i) {
        list.get(i).convert(libList.get(i));
    }
}

ステップ4:サンプルリストデータを作成してテストする

    List<Foo<?>> listOfFoos = new ArrayList<Foo<?>>();
    List<Bar<?>> listOfBars = new ArrayList<Bar<?>>();
    listOfFoos.add(new Foo1());
    listOfFoos.add(new Foo2());
    listOfBars.add(new Bar1());
    listOfBars.add(new Bar2());
    convertList(listOfFoos,listOfBars);
于 2012-10-10T13:14:36.680 に答える