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

好吧,这取决于您想要实现的目标以及实现类是否需要知道类型。对我来说,您的建议似乎设计过度(太复杂),但如果没有更具体的信息,真的很难说。

我这么说的原因是我不喜欢你想为你的接口实现两个单独的类(每种类型一个)。使用泛型的优势通常在于找到一种使用泛型类型 T 的类来实现它的方法。

再说一次,我可能误解了你在这里的意图......

无论如何,作为一个简单的例子,如果你的函数是纯数学的,比如getMax()and getMin(),那么你肯定不需要知道更多关于 T 的信息,而不是 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 回答