0

次のようなインターフェースがあるとします。

public interface UnaryFunction<Ret, Arg> {
    public Ret invoke(Arg arg);
}

public interface BinaryFunction<Ret, Arg1, Arg2> {
    public Ret invoke(Arg1 arg, Arg2 arg);
}

次のようなラッパー クラスがあるとします。

public class ConstructorWrapper<Ret> {
    // Wrapper for a java.lang.reflect.Constructor
    private final Constructor<Ret> constructor;

    // Try blocks in the following elided for brevity

    // Trying to implement UnaryFunction<Ret, Arg> with this
    public <Arg> Ret invoke(Arg arg) { return constructor.newInstance(arg); }

    // Trying to implement BinaryFunction<Ret, Arg1, Arg2> with this
    public <Arg1, Arg2> Ret invoke(Arg1 arg1, Arg2 arg2) { return constructor.newInstance(arg1, arg2); }
}

と の両方をConstructorWrapper実装するように宣言されるように、これを変更するにはどうすればよいですか? さらに良いことに、引数が 1 つのコンストラクターを渡すと実装のみのオブジェクト (またはそのサブクラス) が生成され、引数が 2 つのコンストラクターを渡すと実装のみのオブジェクトが生成されるようにするにはどうすればよいでしょうか (つまり、 aが期待される場所で単項コンストラクタを渡さないでください)? できるだけ繰り返しを少なくしたいですか?UnaryFunctionBinaryFunctionConstructorWrapperUnaryFunctionConstructorWrapperBinaryFunctionBinaryFunction

4

3 に答える 3

0

代わりにファクトリを使用します。

public class ConstructorFactory
{
    public static <Ret, Arg> Ret invoke(UnaryFunction<Ret, Arg> f, Arg arg)
    {
        return f.invoke(arg);
    }

    public static <Ret, Arg1, Arg2> Ret invoke(BinaryFunction<Ret, Arg1, Arg2> f, Arg1 arg1, Arg2 arg2)
    {
        return f.invoke(arg1, arg2);
    }
}
于 2012-09-06T08:25:32.197 に答える
0

何が問題なのですか:

public class ConstructorWrapper<Ret, Arg, Arg1, Arg2>
  implements UnaryFunction<Ret, Arg>, BinaryFunction<Ret, Arg1, Arg2>

クラスが両方の API を提供することの何が問題なのですか?

両方がない場合は、その 2 つのラッパーを作成します。コードの重複を減らしたい場合は、抽象スーパークラスを持つことができます。しかし、タイプ セーフが必要な場合は、ラッパー クラスでインターフェイスを実装する必要があります。

于 2012-09-06T07:29:23.913 に答える