所以,让我们说我想写一个操作不同类型数字的类,但我不知道我将要操作什么类型的数字(即整数,双数等)。
我想使用泛型为这个场景创建一个通用类。类似的东西:
Adder<Double> adder = new Adder<Double>();
adder.add(10.0d, 10.0d); // = 20.0d
但是,我无法实例化我传入Adder类的泛型类型!那么 - 该怎么办?
答案 0 :(得分:6)
哦哦---泛型不是C ++模板。由于类型擦除,示例中的Double
甚至不会显示给运行时系统。
在您的特定情况下,如果您只想将各种类型添加到一起,我可以建议方法重载吗?例如,double add(double, double)
,float add(float, fload)
,BigDecimal add(BigDecimal, BigDecimal)
等
答案 1 :(得分:2)
我认为你可以做你想做的事,但鉴于你提供的信息,我不确定。听起来好像你想要以下一些变化:
public class Foob<T extends Number> {
public T doSomething(T t1, T t2) {
return null;
}
}
答案 2 :(得分:0)
如果你不知道你将要操作什么类型的数字,那么你可能不会使用自己的实例变量。在这种情况下,您可以编写静态方法,而不需要实例化您的类。
如果您确实需要自己的中间变量,那么您可能需要为您正在使用的每个用户变量类别定义不同的变量。例如,如果有人试图使用您的类来操作 BigDecimal 变量,那么您可能不会将 int 变量用于中间结果。
答案 3 :(得分:0)
我不确定仿制药是你想要的。 java中的泛型用于强制执行编译时约束,而不是运行时多态。我认为你真正想要的是使用重载。使用泛型,你会有类似的东西:
interface Adder<T> {
T add(T arg1, arg3);
}
和一堆:
class DoubleAdder implements Adder<Double> {
Double add(Double arg1, Double arg2) {
return arg1.add(arg2);
}
}
然后是一堆:
if (arg1 instanceof Double) {
Adder<Double> adder = new DoubleAdder();
}
使用泛型并不能为您节省任何费用。
答案 4 :(得分:0)
我同意拉普利的观点。重载是对你有帮助的。你最接近使用泛型的是这样的:
公共类NumericOps
{
public T add(T n1,T n2){
//n1.add(n2);
//这是不可能的,因为Number没有add方法,因此
//你必须确定n1的类型
//我们无法确定U的类型,因为它在运行时不存在
//由于类型擦除
if(n1 instanceof Integer){
//添加整数...
}
否则如果(n1 instanceof Double){
//添加双打
}
return null;
}
}
但这并没有多大帮助,因为使用泛型没有任何好处。
答案 5 :(得分:0)
如果您可以将所有内容转换为计算的双精度,则可以使用多态
Number someNumberFunction(Number n1, Number n2)
{
double
d1 = n1.doubleValue(),
d2 = n2.doubleValue();
/* perform computations on d1 & d2 */
}
不幸的是,这在BigInteger或BigDecimal
上效果不佳