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