Java:使用泛型实现对不同类型的数字进行操作的类
所以,假设我想写一个对不同类型的数字进行运算的类,但我事先不知道我将对什么类型的数字(例如整数、双精度等)进行运算 我想使用泛型为这个场景创建一个通用类。比如:Java:使用泛型实现对不同类型的数字进行操作的类,java,generics,Java,Generics,所以,假设我想写一个对不同类型的数字进行运算的类,但我事先不知道我将对什么类型的数字(例如整数、双精度等)进行运算 我想使用泛型为这个场景创建一个通用类。比如: Adder<Double> adder = new Adder<Double>(); adder.add(10.0d, 10.0d); // = 20.0d interface Adder<T> { T add(T arg1, arg3); } 加法器加法器=新加法器(); 加法器。
Adder<Double> adder = new Adder<Double>();
adder.add(10.0d, 10.0d); // = 20.0d
interface Adder<T> {
T add(T arg1, arg3);
}
加法器加法器=新加法器();
加法器。加法(10.0d,10.0d);/=20.0d
但是,我无法实例化传入加法器类的泛型类型!那么,该怎么办? uh哦---泛型不是C++模板。由于类型擦除,您的示例中的Double
甚至不会显示到运行时系统
在您的特定情况下,如果您只想将各种类型添加到一起,我可以建议方法重载吗?e、 例如,double add(double,double)
,float add(float,fload)
,BigDecimal add(BigDecimal,BigDecimal)
,等等。我想你可以做你想做的事,但鉴于你提供的信息,我不确定。听起来好像你想要以下的一些变化:
public class Foob<T extends Number> {
public T doSomething(T t1, T t2) {
return null;
}
}
公共类Foob{
公共剂量测定法(t1,t2){
返回null;
}
}
如果您不知道要对哪些类型的数字进行操作,那么您可能不会使用自己的实例变量。在这种情况下,您可以编写静态方法,而无需实例化类
如果您确实需要自己的中间变量,那么您可能需要为正在使用的每类用户变量定义不同的中间变量。例如,如果有人试图使用您的类对BigDecimal变量进行操作,您可能不会使用int变量作为中间结果。我不确定泛型是否是您想要的。java中的泛型用于强制执行编译时约束,而不是运行时多态性。我认为你真正想要的是使用重载。使用泛型,您将得到如下结果:
Adder<Double> adder = new Adder<Double>();
adder.add(10.0d, 10.0d); // = 20.0d
interface Adder<T> {
T add(T arg1, arg3);
}
接口加法器{
T添加(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();
}
类双加法器实现加法器{
双加(双arg1,双arg2){
返回arg1.add(arg2);
}
}
然后是一堆:
class DoubleAdder implements Adder<Double> {
Double add(Double arg1, Double arg2) {
return arg1.add(arg2);
}
}
if (arg1 instanceof Double) {
Adder<Double> adder = new DoubleAdder();
}
if(arg1 instanceof Double){
加法器加法器=新的双加法器();
}
使用泛型并不能为你节省任何东西。我同意拉普利的观点。超载是对你有帮助的。使用泛型最接近的方法如下: 公共类数字图标
{
公共T添加(T n1,T n2){
//n1.添加(n2);
//这是不可能的,因为Number没有add方法,因此
//您必须确定n1的类型。
//我们无法确定U的类型,因为它在运行时不存在
//由于类型擦除
如果(n1整数的实例){
//添加整数…
}
如果(双精度的n1实例){
//添加双打
}
返回null;
}
}
但是这并没有多大帮助,因为使用泛型没有任何好处。如果你能接受将所有东西都转换为双精度的计算,那么你可以使用多态性
Number someNumberFunction(Number n1, Number n2)
{
double
d1 = n1.doubleValue(),
d2 = n2.doubleValue();
/* perform computations on d1 & d2 */
}
不幸的是,这在BigInteger或BigDecimal上不能很好地工作我假设加法器将被声明为类加法器,在这种情况下,“add”方法实现将只能使用数字API。您打算如何使它对所有数字对象正确工作?添加biginger的实现对于添加double不起作用;什么是i+i?机器代码的艺术风格令人讨厌。接受它。或者确保下一种语言更聪明。0投票否决谢谢,克里斯。但是,说真的,我有一个大类,它需要对不同类型的数字执行相同(大量)的操作。你是说我要把它放回复印粘贴机上?