1

Javaでジェネリックを学ぼうとしていました。

ボックスクラスを作成しました。

パッケージcom.generic;

public class Box<T> {

    T length;   
    T breadth;
        // Setter and getter

}

ここで、ボックスの面積を計算するメソッドを作成したいと思いましたlength * breadth

Long 、 Double 、 Integer などを使用できるように汎用にしました。

しかし、このようにcalculateAreaメソッドを作成しようとすると

T area(T w , T h)
    {
        return (w * h); 
    }

しかし、それは私にコンパイル時エラーを与えています。

ジェネリックでは乗算を実行できないと思います。

areaでは、メソッドをジェネリックにするために何ができますか?

ありがとう。

4

4 に答える 4

4

そのための良い解決策はないと思います。とにかく、これを試してください

class Box<T extends Number> {
    T length;
    T breadth;

    T area(T w , T h) {
        if (w instanceof Double) {
            return (T) w.getClass().cast(w.doubleValue() * h.doubleValue()); 
        }
        if (w instanceof Long) {
            return (T) w.getClass().cast(w.longValue() * h.longValue()); 
        }
        if (w instanceof Integer) {
            return (T) w.getClass().cast(w.intValue() * h.intValue()); 
        }
        throw new IllegalArgumentException();
    }
}
于 2013-06-30T05:42:58.673 に答える
1

これはうまくいくかもしれません

public class Box<T extends Number> {

T length;
T breadth;
// Setter and getter


public T getLength() {
    return length;
}

public void setLength(T length) {
    this.length = length;
}

public T getBreadth() {
    return breadth;
}

public void setBreadth(T breadth) {
    this.breadth = breadth;
}

Number area(T w , T h)
{
   return (w.doubleValue()*h.doubleValue());
}
}
于 2013-06-30T05:47:16.693 に答える
0

T はオブジェクトであり、それに対して '*' を実行したいので、内部オブジェクトはプリミティブである必要がありますが、数値のみである必要があります。

'T' は文字列またはブール値の場合もあるため、Java は任意の 'T' で '*' を使用できないようにする必要があります。

プリミティブを「int」、「float」、または「double」として自動的にボックス化およびボックス化解除し、計算を行い、それらをボックス化するには、ジェネリックが必要です。

Area メソッドを記述した方法で実行できるかどうかはわかりません。

編集:

または、Evgeniy の投稿された回答を使用して、Boxing/UnBoxing を手動で行うことができます...

于 2013-06-30T05:44:55.267 に答える
0

コンパイラは、 が であるかであるTかをコンパイル時に認識しません。参照型ではなく値型に対してのみプリミティブ操作を実行できるため、コンパイル時にエラーが発生します。そのため、事前に T の型をコンパイラに伝える必要があります。Tvalue typereference type

class Box<T extends whatYouWant> {
    T length;
    T breadth;
//more stuff
}
于 2013-06-30T05:48:27.977 に答える