使用通用代码在Java中实现通用接口

时间:2012-09-06 07:26:00

标签: java generics reflection interface

假设我有如下接口:

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

3 个答案:

答案 0 :(得分:0)

有什么问题:

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

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

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

答案 1 :(得分:0)

  

如何实现它以便传入单参数构造函数会导致只实现UnaryFunction的ConstructorWrapper对象(或其中的子类)并传入双参数构造函数,从而产生仅实现BinaryFunction的ConstructorWrapper对象。 / p>

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

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

class ConstructorWrapperBinary<Ret, Arg1, Arg2> extends ConstructorWrapper {...}

答案 2 :(得分: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);
    }
}