具有不同参数的抽象函数

Abstract function with different parameters

我想用抽象函数 calc() 声明一个抽象 class 并将其与不同类型的参数一起使用。

public abstract class AbstractCalculation{
    public abstract double calc();
    ...
}

public StringClass extends AbstractCalculation{
    public double calc(String a, String b);
}

public DoubleClass extends AbstractCalculation{
    public double calc(double a, double b);
}

我该如何解决这个问题?

也许您的意思是像这样使用泛型:

public abstract class AbstractCalculation<T> {
    public abstract double calc(T...params);//Here you can pass N param with any type
}

要从这个摘要 class 扩展,您可以使用:

public class DoubleClass extends AbstractCalculation<Double> {

    @Override
    public double calc(Double... params) {
        //Your action here
    }
}

public class StringClass extends AbstractCalculation<String> {

    @Override
    public double calc(String... params) {
        //Your action here
    }
}

使用泛型 https://docs.oracle.com/javase/tutorial/java/generics/why.html

public abstract class Calculator<T, R>{
    public  abstract Double calc(T t, R r);
}

StringClass.java

public class StringClass extends Calculator<String, String>{

    @Override
    public Double calc(String t, String r) {
        return null; //TODO your logic
    }
}

DoubleClass.java

public class DoubleClass extends Calculator<Double, Double>{

    @Override
    public Double calc(Double t, Double r) {
        return null; //TODO your logic
    }
}

如果你想要灵活的 return 类型。

CalculatorV1.java

public abstract class CalculatorV1<T, R, V> {
    public abstract V calc(T t, R r);
}

DoubleClassV1.java

public class DoubleClassV1 extends CalculatorV1<Double, Double, Integer>{

    @Override
    public Integer calc(Double t, Double r) {
        return null; //TODO your logic
    }
}

您可以使用 Generics 来做到这一点,但您不能对它们使用原始数据类型。

要了解有关泛型的更多信息,请参阅

public abstract class AbstractCalculation<T, V> {
    public abstract T calc(T t, V v);
    ...
}

现在用类型扩展这个 class。
喜欢:

class IntegerAddImpl extends AbstractCalculation<Integer, Integer> {
    @Override
    public Integer calc(Integer t, Integer v) {
        return t + v;
    }
}
class StringAddImpl extends AbstractCalculation<String, String>{
    @Override
    public String calc(String t, String v) {
        return t + v;
    }
}