2011-10-15 2 views
1

나는 숙제를하고있다.Java generics를 계산기에 적용하는 방법은 무엇입니까?

첫째, 계산식을 계산할 수있는 작업이있었습니다. 5 * (2 + 1)입니다.

이제 새로운 과제가 생겼습니다. 입력 매개 변수에 따라 표현식을 다른 유형 (Integer, Double, Long, Float)으로 계산해야합니다. 그리고 제네릭을 사용해야합니다.

문제는 프로그램 구조에서이를 구현하는 방법을 이해할 수 없다는 것입니다. 이제 간단히 설명하겠습니다.

클래스 토큰 {토큰 종류, 이중 값} - 토큰을 포함합니다.

클래스 TokenStream - 표현식을 토큰으로 나눕니다.

클래스 파서이 - 역 폴란드 표기법에

클래스 평가자을 토큰을 구문 분석 트리를 구축하고, 저장 - RPN

클래스 석회질 평가 - 포함 주요 기능

교사 충고 사용 :

나는 이것을 어떻게하는지 이해하지 못하고 무엇을 의미 하는지를 모른다. 조언 할 수 있니?

추신 : 내 영어 :

답변

5

귀하의 주요 문제에 대한 죄송합니다 당신이 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()); 

    } 

} 
관련 문제