我试图用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
方法通用?
感谢。
答案 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)
编译器在编译时不知道T
,T
是value type
还是reference type
。它将给出编译时错误,因为我们只能对值类型执行基本操作,而不能对引用类型执行
所以你必须事先告诉编译器T的类型
class Box<T extends whatYouWant> {
T length;
T breadth;
//more stuff
}