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 发布的答案,并手动进行装箱/拆箱...

于 2013-06-30T05:44:55.267 回答
0

编译器不知道Ton compileT是 avalue type还是 a reference type。它会产生编译时错误,因为我们只能对值类型执行原始操作,而不能对引用类型执行原始操作,因此您必须提前告诉编译器 T 的类型

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