Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为一个方法参数定义多个可接受的类类型?_Java_Constructor_Superclass - Fatal编程技术网

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

Java 如何为一个方法参数定义多个可接受的类类型?,java,constructor,superclass,Java,Constructor,Superclass,作为家庭作业辅助,我被要求用java构建某种计算器。 为了更容易地创建表达式,我想添加一些构造函数,它们为创建Num和Var类提供“快捷方式”。例如,我希望能够编写新的加号(“x”,5)并得到相同的结果表达式,而不是编写新的加号(newvar(“x”),newnum(5))。 为了不重复代码行,我创建了一个名为BinaryExpression的抽象类,其中包含我的构造函数所需的所有可能的组合。 我正试图找到一种优雅的方法来构造一个plus类,而不需要重新编写相同的代码 public abstra

作为家庭作业辅助,我被要求用java构建某种计算器。 为了更容易地创建表达式,我想添加一些构造函数,它们为创建Num和Var类提供“快捷方式”。例如,我希望能够编写新的加号(“x”,5)并得到相同的结果表达式,而不是编写新的加号(newvar(“x”),newnum(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);
   }

public BinaryExpression(String x, Double y) {
    this(new Var(x), new Num(y));
}
public类Plus扩展二进制表达式{
公共Plus(x,y){
super(x,y);
}
所以我只接受这样的类类型,它们将适合于BinaryExpression类中指定的构造函数。
谢谢:)

问题在于,您需要一些通用容器来存放对象,这些对象可以被视为表达式的实例,而不是表达式的实例。
(示例:字符串,双精度)

这个答案假设如下:

class Num implements Expression
class Var implements 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 class Plus extends BinaryExpression {
    public Plus(<String,Double, Expression> x, <String,Double, Expression> y) {
        super(x, y);
   }

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

你在找泛型吗?看起来你可以用依赖注入来实现工厂类?(主程序员可能会对我怒目而视?:)你可以用重载构造函数来实现这一点。
public Plus(Object,Object)
也可以。@markspace我已经尝试过了,不会编译…并为
表达式
Var
Num
编写代码。