2012-05-15 6 views
2

나는 다항식 계수의 일반화 된 유형을 가진 다항식 클래스를 구현 중이다. 이 코드는 다음과 같습니다.Java에서 일반화 된 유형에 대한 계산을 수행하는 방법은 무엇입니까?

public class Polynomial<T> { 

private HashMap<Integer, T > polynomial; 

public Polynomial(T coefficient, Integer index) { 
    polynomial = new HashMap<Integer, T>(); 
    if (coefficient!=0) 
     polynomial.put(index, coefficient); 
} 

public void sum(Polynomial<T> w) { 
    for (Map.Entry<Integer, T> e : w.polynomial.entrySet()) { 
     T tmp = polynomial.get(e.getKey()); 
     if(tmp==null) 
      polynomial.put(e.getKey(), e.getValue()); 
     else { 
      polynomial.remove(e.getKey()); 
      if (tmp+e.getValue()!=0) 
       polynomial.put(e.getKey(), tmp+e.getValue()); 
     } 
    } 
} 

... 

} 

명백한 이유로 컴파일되지 않습니다. 연산자 : ==,! =, +, - 및 *는 일반화 된 유형 T에 대해 정의되지 않았습니다. Java에서 알고있는 것으로부터 연산자를 재정의 할 수 없습니다. 이 문제를 어떻게 해결할 수 있습니까?

+1

이 질문을보십시오. http://stackoverflow.com/questions/8669838/java-generics-and-adding-numbers-together/8669901#8669901. – Novakov

+0

나는 더 좋은 모델은 Monomial이 될 것이라고 생각한다. 계수와 지수가있는 단일 항이다. A Polynomial은 Monomials의 모음입니다. y = c * x^1000 + 1과 같은 것을 더 잘 표현할 수 있습니다. – duffymo

답변

1

클래스를 선언 할 때 어떤 유형을 허용하는지 조금 더 구체적으로 설명 할 수 있습니다. 이것은 당신이 형식 매개 변수가 있어야한다는 지정할 수 있다는 것을 의미 Number :

public class Polynomial<T extends Number> 

그런 원시적으로 바꿀 및 산술 연산을 수행 할 수 클래스 (intValue(), doubleValue() 등)의 방법을 사용할 수 있습니다 그걸로. 이상적은 아니지만, doubleValue()을 사용하고 숫자가 너무 크지 않은 경우 제대로 작동해야합니다.

+0

는 너무 구체적입니다. 내가 볼 수있는 방식은 ComplexNumber 클래스를 작성하는 것입니다.이 클래스는 또한 다항 클래스와 함께 잘 작동해야합니다 (T = 정수 또는 Double로도 잘 작동해야 함). 그래서 나는 생각하는 인터페이스가 필요하다. 그러나 그것을하는 법을 모릅니다. 심지어 가능합니까? – xan

+0

흠. ComplexNumber와 동일한 인터페이스를 구현하는 클래스에서 Integer, Double 등을 래핑하지 않고도 가능하다는 것을 알지 못합니다. 나는 Number와 그것의 서브 클래스가 더 많은 인터페이스를 필요로한다고 항상 생각했다. –

2

Java의 제네릭은 C++의 제너릭과 다르게 작동하므로 연산자를 사용할 수 없습니다. 유형을 확인해야합니다. T은 인터페이스를 구현하고 인터페이스의 메소드를 계산에 사용합니다. 표준 라이브러리의 Number 인터페이스를 사용하여 doubleValue() 개체를 호출하고이를 기반으로 계산할 경우 private HashMap<Integer, T extends Number >과 같은 정의를 사용할 수 있습니다.이 경우 T에서 Number의 메서드에 액세스 할 수 있습니다.

add(), mul() 등의 메서드를 사용하여 사용자 지정 인터페이스를 기반으로 클래스를 만들 수도 있습니다. 메서드 호출이므로 여기에서 기본 형식을 사용할 수 없으므로 많은 성능이 손실되고 C++보다 Java의 경우와 같이 코드를 작성하는 이유가 적습니다. Trove과 같은 일부 라이브러리는 Java Generics 대신 실제로 코드 생성을 사용하여 매개 변수화 된 클래스 집합에 대해 C++과 같은 선행 처리기 스타일의 동작을 얻습니다.

관련 문제