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声明同时实现UnaryFunctionand BinaryFunction?更好的是,我如何做到这一点,以便传入一个单参数构造函数会导致一个ConstructorWrapper只实现的对象(或其中的子类),UnaryFunction而传入一个双参数构造函数会导致一个ConstructorWrapper只实现的对象BinaryFunction(即你不要'不要在BinaryFunction预期a 的地方传入一元构造函数)?最好尽量少重复?

4

3 回答 3

0

出什么问题了:

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

让一个类同时提供两个 API 有什么问题?

如果两者都没有,请制作两个包装纸。如果您想减少代码重复,它们可以有一个抽象超类。但是如果你想要类型安全,包装类应该实现接口!

于 2012-09-06T07:29:23.913 回答
0

我该如何做到这一点,以便传入一个单参数构造函数会导致一个仅实现 UnaryFunction 的 ConstructorWrapper 对象(或其中的子类),而传入一个双参数构造函数会导致一个仅实现 BinaryFunction 的 ConstructorWrapper 对象。

这只有在您有两个不同的来创建这些ConstructorWrapper对象时才有可能,例如

class ConstructorWrapperUnary<Ret, Arg1> extends ConstructorWrapper {...}

class ConstructorWrapperBinary<Ret, Arg1, Arg2> extends ConstructorWrapper {...}
于 2012-09-06T07:41:09.720 回答
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 回答