2

次のようなものがあるという意味で、Java の関数テンプレートに類似したものをシミュレートしようとしています。

public interface MyFunctionTemplate<T> {
    void doSomething(T thing);
}

public class MyIntegerFunctionTemplate extends MyFunctionTemplate<Integer> { ... }
public class MyStringFunctionTemplate extends MyFunctionTemplate<String> { ... }

ある種の中央レジストリが必要になるようです。次のようなもの:

public class MyFunctionTemplateRegistry {
    private static Map<Class<?>, MyFunctionTemplate<?>> registry;

    public static <T> void register(Class<T> templateClass, MyFunctionTemplate<T> templateFunction);

    public static void doSomething(Object thing);
}

そのようなものを設計する最良の方法は何ですか?

4

1 に答える 1

0

まあ、それはあなたが何を達成したいか、そして実装クラスがタイプを知る必要があるかどうかに依存します。私には、あなたの提案は過剰に設計されているように見えますが(複雑すぎる)、より具体的な情報がなければ言うのは本当に難しいです。

私がこれを言っている理由は、インターフェースに2つの別々のクラス(タイプごとに1つ)を実装したいという事実が気に入らないからです。ジェネリックスを使用することの強みは、ジェネリック型Tを使用して1つのクラスでそれを実装する方法を見つけることにあることがよくあります。

それならまた、ここであなたの意図を誤解したかもしれません...

とにかく、簡単な例として、関数が純粋に数学的なものである場合、とのようなものであれば、getMax()TgetMin()がTに匹敵するという事実以外に、Tについて何も知る必要はありません。

次に、次のような結果になる可能性があります。

public class FindExtremes<T extends Comparable<T>> {
    T getMax(T a, T b) {
        return a.compareTo(b) >= 0 ? a : b;
    }
    T getMin(T a, T b) {
        return a.compareTo(b) <= 0 ? a : b;
    }
}

これは、Comparableを実装する任意のクラスに直接使用できます。

new FindExtremes<Integer>().getMax(4, 5);
new FindExtremes<Double>().getMax(4.444D, 5.555D);
new FindExtremes<String>().getMax("abc", "zyx");
于 2013-02-18T22:58:43.777 に答える