귀하의 주요 문제에 대한 죄송합니다 당신이 long int와 같은 원시 형을 사용하고 있다는 점이다 등 두 개체의 insted. Generics firs 규칙을 기억할 때 generics는 Object 유형에서만 작동합니다. 이 경우에는 Integer, Long, Double 등이됩니다.
중요한 정보 네 가지 경우, Java의 모든 숫자 Object는 Number 클래스를 확장해야합니다. 우리가 이것을 알게되면 해결책의 그림이 생기기 시작합니다.
public abstract interface Operation<T extends Number> {
T parse(String expression);
T add(T number1, T number2)
}
그런 다음이 인터페이스를 구현하는 클래스는 모든 숫자 유형을 처리합니다.
는 Long.class 예에 대한 구현은 다음과 같이 진행한다 :
public final OperationForLong implements Operation<Long> {
@Override
Long parse(String expression) {
// code omitted
}
@Override
Long add(Long number1, Long number2) {
// code omitted
}
}
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);
}
그리고 예를 구현 :
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());
}
}