我创建了一个计算表达式的方法,该表达式是字符串连接或算术运算。所以我想创建一个可以返回String或Integer的方法。有更优雅和正确的方法吗?
private static Object calculateExpression(Object object) {
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression((String) object);
if (expression.getValue() instanceof Integer) {
return expression.getValue();
} else if (expression.getValue() instanceof String) {
return expression.getValue();
}
throw new IllegalArgumentException("Can process only Strings or Integers");
}
答案 0 :(得分:1)
如果您知道要传递的表达式应该被评估为什么类型,则可以使用泛型。我也会在参数中要求字符串而不是对象。因为SpEL总是一个字符串。
private static <T> T calculateExperssion(String expr, Class<T> class) {
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression(expr);
return class.cast(expression.getValue());
}
使用此选项时,第二个参数可以是String.class
或Integer.class
答案 1 :(得分:1)
不,除非你在打电话之前认识课程,否则你可以使用仿制药,正如Stav Saad所说。否则你只需返回它并在返回后使用instanceof
。然后你的功能就会变成。
private static Object calculateExpression(String input) {
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression(input);
if (expression.getValue() instanceof Integer || expression.getValue() instanceof String ) {
return expression.getValue();
}
throw new IllegalArgumentException("Can process only Strings or Integers");
}
public static void useCalculate() {
Object expression = calculateExpression("Test");
if(expression instanceof String) {
//Do stringy stuff
} else if(expression instanceof Integer) {
//To inty stuff
}
}
答案 2 :(得分:1)
好吧,我会添加一件事。在您的情况下,如果是字符串或整数,则返回结果,如果条件未满,则返回null
。在这种情况下,没有必要使用instaceof
运算符。你可以简单地返回价值。 Instanceof
您必须在调用函数的地方使用Expression e = calculateExpression(Object object);
if(e.getValue().instanceof(Integer))
int variabl = e.getValue();
else if(e.getValue().instanceof(String))
String s = e.getValue();
。这是一个例子:
if (!(expression.getValue() instanceof Integer) || !(expression.getValue() instanceof Integer))
throw someExceptions();
如果您只想评估字符串和整数,那么仅对无法处理的情况进行测试。
instanceof
\这里需要因为你需要知道在将它赋给变量之前你得到了什么样的值,所以 If Worksheets("XXX").Range("D13") > 0 Then
MsgBox ("ATENTION!" & vbCrLf & "OLD = ") & Worksheets("XXX").Range("D13") & " PCS !"
End If
If Worksheets("XXX").Range("E13") > 0 Then
MsgBox ("ATENTION!" & vbCrLf & "REQUEST = ") & Worksheets("XXX").Range("E13") & " PCS !"
End If
运算符是针对这种情况做出的。
所以在你的情况下你不需要检查实例,因为我猜这个Expression是你的Integer和String的超类。