2

一般化されたタイプの多項式係数を持つ Polynomial クラスを実装しています。私はこのコードを持っています:

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 で知っていることから、演算子をオーバーライドすることはできません。どうすればこの問題を解決できますか?

4

2 に答える 2

2

Java のジェネリックは C++ のジェネリックとは異なる動作をするため、演算子は使用できません。型Tが何らかのインターフェースを実装していることを確認し、計算にインターフェースのメソッドを使用する必要があります。オブジェクトを呼び出してそれに基づいて計算Numberできる標準ライブラリのインターフェイスを使用したとします。 などの定義を使用できます。この場合、T から のメソッドにアクセスできます。doubleValue()private HashMap<Integer, T extends Number >Number

add()などのメソッドを使用して、カスタム インターフェイスに基づいて独自のクラスを作成することもできますmul()。これらはメソッド呼び出しであるため、ここではネイティブ型を使用できません。パフォーマンスの多くが失われ、そのようなコードを記述する理由が少なくなります。 C++ よりも Java の例のように。のような一部のライブラリは、TroveJava Generics の代わりにコード生成を実際に使用して、パラメータ化されたクラスのセットに対して C++ のようなプリプロセッサ スタイルの動作を取得します。

于 2012-05-15T12:13:30.033 に答える
1

クラスを宣言するときに受け入れる型について、もう少し具体的にすることができます。これは、型パラメーターがNumberでなければならないことを指定できることを意味します。

public class Polynomial<T extends Number>

その後、 Number クラスのメソッド ( 、 など) を使用してintValue()doubleValue()それをプリミティブに変換し、それに対して演算を行うことができます。これは理想的ではないことはわかっていますが、使用doubleValue()していて数値が大きすぎない場合は問題なく動作するはずです。

于 2012-05-15T12:12:31.303 に答える