如何在计算面积法中使用泛型?

时间:2013-06-30 05:25:58

标签: java generics

我试图用Java学习泛型。

我创建了一个盒子类。

package 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 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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());
}
}

答案 2 :(得分:0)

由于T是一个对象而你想在它上面执行'*',你需要你的内部对象是基元,但只需要数字。

'T'也可以是字符串或布尔值,因此java必须保护您不会在任何给定的'T'上使用'*'。

你需要泛型来自动地将你的基元包装和解包为'int','float'或'double',进行计算,并将它们装箱。

我不知道是否可以按照编写Area方法的方式完成。

编辑:

或者,你可以使用Evgeniy发布的答案,并手动进行拳击/取消拳击......

答案 3 :(得分:0)

编译器在编译时不知道TTvalue type还是reference type。它将给出编译时错误,因为我们只能对值类型执行基本操作,而不能对引用类型执行 所以你必须事先告诉编译器T的类型

class Box<T extends whatYouWant> {
    T length;
    T breadth;
//more stuff
}