blu*_*yte 1 java generics calculator
我做功课.
首先,有一个任务来制作计算器,它可以评估这样的表达式:5*(2 + 1).
现在,我有了新任务.根据输入参数,表达式必须以不同类型(Integer,Double,Long,Float)计算.我应该使用泛型.
问题是我无法理解如何在程序结构中实现它.现在,我将简要介绍一下.
Class Token {char kind,double value} - 包含令牌.
Class TokenStream - 将表达式拆分为标记.
Class Parser - 构建一个解析树,并以反向波兰表示法保存令牌
类评估器 - 评估RPN
Class Calc - 包含主要功能
老师建议使用:
interface Operation<E> {
E parse(String)
E add(E e1, E e2)
...
}
IntOperation implements Operation<Integer> {...}
Run Code Online (Sandbox Code Playgroud)
我不明白该怎么做以及他的意思.你能建议吗?
PS:抱歉我的英文:)
你的主要问题是你正在使用像对象的int,long,double等基本类型.当您使用Generics时,第一条规则要记住,泛型仅适用于对象类型.在这种情况下将是整数,长,双等.
重要信息四,您的情况是,Java中的所有数字对象都应该扩展Number类.当我们知道这一点时,解决方案的图片就会开始出现.
public abstract interface Operation<T extends Number> {
T parse(String expression);
T add(T number1, T number2)
}
Run Code Online (Sandbox Code Playgroud)
然后,将实现此接口的类将处理所有数字类型.
例如,对于Long.class,实现如下:
public final OperationForLong implements Operation<Long> {
@Override
Long parse(String expression) {
// code omitted
}
@Override
Long add(Long number1, Long number2) {
// code omitted
}
}
Run Code Online (Sandbox Code Playgroud)
PS.我用过你的界面设计.但我认为解析和计算的逻辑应该是分开的.这意味着相反,有一个接口执行解析操作并计算结果.你应该有两个接口用于解析,第二个接口用于计算.例如,您可以在将来只传递数字,而不包含带表达式的字符串.
所以设计理念:
public abstract interface MathExpressionParser {
public Calculation parse(String expression);
}
public abstract interface Calc<T extends Number> {
public abstract T add(T num1, T num2);
public abstract T substract(T num1, T num2);
public abstract T multiple(T num1, T num2);
public abstract T divide(T num1, T num2);
}
Run Code Online (Sandbox Code Playgroud)
以及示例实现:
public RPNCalculation implements MathExpressionParser {
public Calculation parse(String expression) {
// do to parse
}
}
public SimpleCalc implements Calc<Number> {
public Number add(Number num1,Number num2) {
if(num1 == null || num2 == null) {
throw new InvalidArgumentExpression("Method Calc.add operate only on non null valuers.");
}
return Double.parse(num1.doubleValue() + num2.doubleValue());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3334 次 |
| 最近记录: |