如何为方法参数定义多个可接受的类类型?

时间:2019-04-18 21:44:20

标签: java constructor superclass

作为一项作业,我被要求用Java构建某种计算器。 为了使创建表达式更容易,我想添加构造函数,这些构造函数提供用于创建Num和Var类的“快捷方式”。例如,与编写new Plus(new Var(“ x”),new Num(5))相比,我希望能够编写new Plus(“ x”,5)并获得相同的结果表达式。 为了不重复代码行,我创建了一个名为BinaryExpression的抽象类,在其中包含了构造函数所需的所有可能组合。 我试图找到一种构造plus类的优雅方法,而无需再次重新编写相同的代码。

public abstract class BinaryExpression implements Expression {

    protected Expression x;
    protected Expression y;

    public BinaryExpression(Expression x, Expression y) {
        this.x = x;
        this.y = y;
    }
    public BinaryExpression(String x, Expression y) {
        this(new Var(x),y);
    }
    public BinaryExpression(Double x, Expression y) {
        this(new Num(x), y);
    }
    public BinaryExpression(Expression x, String y) {
        this(x ,new Var(y));
    }
    public BinaryExpression(Expression x, Double y) {
        this(x ,new Num(y));
    }
    public BinaryExpression(String x, String y) {
        this(new Var(x) ,new Var(y));
    }
    public BinaryExpression(Double x, Double y) {
        this(new Num(x) ,new Num(y));
    }
    public BinaryExpression(Double x ,String y){
        this(new Num(x) ,new Var(y));
    }
    public BinaryExpression(String x ,Double y){
        this(new String(x) ,new Num(y));
    }

我正在寻找这样的解决方案:

public class Plus extends BinaryExpression {
    public Plus(<String,Double, Expression> x, <String,Double, Expression> y) {
        super(x, y);
   }

所以我只接受此类类型,以使它们适合BinaryExpression类中的指定构造函数。 谢谢:)

1 个答案:

答案 0 :(得分:1)

问题是您需要一些通用的容器来存放对象,这些对象可以视为它们是Expression的实例,而实际上却不是Expression的实例。
(例如:String,Double)

此答案假定以下条件:

class Num implements Expression
class Var implements Expression

并且存在以下构造函数,或者没有为类Expression定义构造函数

public Expression() {}

我认为一个很好的解决方案就是@markspace建议。您可以通过使用instanceof确定将参数强制转换为什么来确保其编译。

public Plus(Object a, Object b) {
    Expression exprA = convertToExpression(a);
    Expression exprB = convertToExpression(b);
    if(exprA == null || exprB == null) {
        // could error handle here or in the place below
    }
    // do initialization here
}
//
public Expression convertToExpression(Object obj) {
    Expression exprObj = null;
    if(obj instanceof String) {
        exprObj = new Var(obj);
    } else if(obj instanceof Double) {
        exprObj = new Num(obj);
    } else {
        // error handle here or in the place above
    }
    return exprObj;
}

此外,以上代码中的最后一个构造函数是否不正确? 似乎应该这样写:

public BinaryExpression(String x, Double y) {
    this(new Var(x), new Num(y));
}