有什么方法可以将两种类型指定为Java中的函数arg类型?

时间:2020-03-29 12:36:49

标签: java

出于某些原因,我不想将Object声明为类型,但是我只需要编译器检查输入是否属于代码中提到的两种类型中的任何一种。 (整数,双精度)

public static Integer/Double on(Integer/Double a,Integer/Double b)
{
return a+b;
}

在Java中没有instanceof可能吗(可能的语法最短)?

3 个答案:

答案 0 :(得分:3)

如果您只需要对IntegerDouble类型执行“操作”,并且需要添加该类型的实例,并且该方法的主体比仅添加参数要复杂得多:使用两个重载,并委托给一个私有方法:

static Integer on(Integer a, Integer b) {
  return on(a, b, Integer::sum);
}

static Double on(Double a, Double b) {
  return on(a, b, Double::sum);
}

private static <T> T on(T a, T b, BinaryOperator<T> sum) {
  // ... Something, using `sum.apply` to add things.
}

调用者(此类之外)只能在此处调用Integer / Double重载。泛型不会直接允许您限制为特定类型;您所能做的就是限制通用方法的可见性。

答案 1 :(得分:2)

您可以这样解决:

static Double on(Double a, Double b) {
    return a+b;
}

static Integer on(Integer a, Integer b) {
    return on(a.doubleValue(), b.doubleValue()).intValue();
}

static void test() {
    System.out.println(on(1.0, 2.0).getClass());
    System.out.println(on(1, 2).getClass());
}

但是,如果您尝试使用两个原语(其中一个是int而另一个是double)来调用它,则将不起作用

static void test2() {
    System.out.println(on(1, 2.0).getClass()); // this doesn't compile
}

答案 2 :(得分:0)

如果使用OOP,最好创建两个重载方法。

一个会是

public static Integer on(Integer a,Integer b){

    return a+b;
}

另一个将会是

public static Double on(Double a,Double b){

    return a+b;
}

根据您的输入,将调用任一方法。而且我认为您想获得这种解决方案。