2011-11-15 10 views
0

私は、数学演算を扱ういくつかのクラスとメソッドを持つ演算子クラスを持っています。演算子クラスは、数値が計算に使用時に動作させる方法を提供する抽象クラスが存在し、このクラスで等Javaのジェネリッククラスを制限する

public class OperatorClass<T extends Number> 

、ジェネリックであり、私の操作はint型とすることができるように、番号を拡張し、倍増、浮い方法

abstract class Op<T extends Number> { 
    abstract T calculate(DataSet<? extends Number> ds); 
} 

例えばAddOpのようなオペアンプを拡張し、複数のクラスがあります。

class AddOp<T extends Number> extends Op<T>{ 
    public T calculate(DataSet<? extends Number> ds) { 
     return ds.getLeft() + ds.getRight(); 
    } 
} 

そして、私のDataSetは、このように見えるだけで、データクラスです。

public class DataSet<T extends Number> { 
private T left; 
private T right; 

public DataSet(T left, T right) { 
    this.left = left; 
    this.right = right; 
} 

public T getLeft() { 
    return left; 
} 
public T getRight() { 
    return right; 
} 

}

私が午前の問題は、数抽象クラスは、+演算子を行うことができないので、ラインds.getLeft() + ds.getRight()がコンパイルされていないということです。どのように私はそれの数学演算を行うことができます(ワイルドカードクラスのような)Numberの型に私のDataSetを取得するのですか?

すべてのヘルプは おかげ

編集

だから、問題の回避策は、私はいくつかのif文を使用して、そう

Number result = null; 
if(ds.getLeft().getClass().equals(Integer.class)) 
    result = new Integer(ds.getLeft().intValue() + ds.getRight().intValue()); 
.... 
return (T) result; 

答えて

1
のような正しいプリミティブデータ型を得たことであると理解されるだろう

追加する解像度を決定する必要があります。つまり、left.getInteger()またはleft.getFloat()に電話していますか?

これを解決するにはいくつかの方法がありますが、それは実際にあなたがやろうとしているところです。あなたの数値を本当にオブジェクトのままにしたい場合は、+のプラス演算子はオブジェクトでは機能しないので使用できません。新しい番号を返すスタイルメソッド呼び出しleft.plus(right)が必要です。

あなたは(おそらく彼らは、収集、保存または何かのためにオブジェクトた)数学の演習中にオブジェクトとしてあなたの番号を維持を気にしないなら、あなたはpublic long getLeft()public T getLeft()を交換して行うために内部番号のleft.getLongValue()に依存しています変換。または、2つのNumberオブジェクトを公開し、「外部」ユーザーに適切なgetXxxValue()コールを実行させることができます。

+0

私はそれが可能かどうかわかりませんが、私はOperatorClassを持つことができるようにしようとしていますそしてすべての操作は整数になり、後でOperatorClassオブジェクトを作成して、ダブルスにいる。 –

+0

数値をオブジェクトにしたい場合は、算術演算のメソッドを実装する必要があります。 '+'、 '-'、' * 'などの数学演算子はビルトイン型でしか機能せず、' + 'が' Strings'を連結するという唯一の例外を除いて 'Objects'では機能しません。 –

+0

私はいくつかのifステートメントを使って、数値がint、double、floatなどであるかどうかをチェックし、数値からint値、double値などを得て算術演算を行った –

0

数値型はプリミティブ型です。それらの上で算術演算を総称的に実装することはできません。 JavaのジェネリックスはC++のテンプレートのようには機能しませんし、型固有のコードを生成しないため、2つのNumberインスタンスまたは他のプリミティブラッパータイプのインスタンスを追加する方法はありません。あなたが何をしようとして

は、Javaで不可能であり、あなたはintための別の方法を記述する必要があります、doublesなど(あるいは、どちらかあなたがサポートしたい。)

0

オーバーロードできません。 Javaの演算子。だから、最も単純には、変更することです:

return ds.getLeft() + ds.getRight(); 

に(のようなもの)を使用すると、ビット型キャストに対処する必要がある場合がありますので、私はよう何かを言う

return ds.getLeft().getDouble() + ds.getRight().getDouble(); 

他の方法がありますgetFloat() getInt()...切り捨てによる損失がないので、私はダブルを選びました。

関連する問題