java - 如何为方法参数定义多个可接受的类类型?
问题描述
作为一项家庭作业,我被要求用 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 类中指定的构造函数。谢谢 :)
解决方案
问题是您需要一些用于对象的通用容器,这些对象可以被视为 Expression 的实例,而不是它们实际上是 Expression 的实例。
(例如:字符串、双精度)
这个答案假设如下:
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));
}
推荐阅读
- pandas - 根据索引中的重复整数集重新排序 pandas DataFrame
- db2 - 应用服务器 CPU 达到 >80 并在近 24 小时后挂起 同样的问题每天都在重复
- reactjs - 页面呈现时反应表列过滤器问题
- python - 使用 pandas 根据日期和每日能量组合两个数据集的问题
- html - 每张幻灯片的背景图像都不会改变
- html - 单击一次后,引导 4 药丸不会停用
- mysql - Mysql 查询 SELECT auto_increment 给定 null
- api - 即使应用程序具有 Teamwork.Migrate.All 权限(BETA),在 Create ChatMessage 上也未获得授权
- php - 不使用 Formbuilder 时,如何在 Symfony 的数据库中保存表单数据?
- python - 如何访问数组中的“隐藏”索引?(Python)