[英]Performing operation using Generic and primitive type not working
尝试使用JAVA-Genric学习一些基本操作,我试图创建一个泛型类,它接受一个数字并对其进行一些操作并返回值但是它的抛出错误
家长班:
public class HelloWorld{
public static void main(String []args){
MathsExec<Integer> my_obj = new MathsExec<Integer>();
int rst = my_obj.doAddition(100);
System.out.println("Solution is : "+rst);
}
}
通用类:
class MathsExec<T>{ //didn't extend NUMBER because m strictly sending int values
T doAddition(T nmbr){
int k=100;
T rst;
rst = nmbr+k;
return rst;
}
}
错误:
MathsExec.java:6:错误:二元运算符'*'的错误操作数类型
rst = nmbr+k; ^
第一种:T
第二种类型:int
其中T是一个类型变量:T扩展在类MathsExec 1中声明的Object错误
我理解为什么会出现这个错误( 操作的类型不兼容 )但是根据泛型,在执行+
操作之前,类型T
应该已经转换为Integer
...或者是否有其他解释我应该知道????
PS:请放心,JAVA不是我强大的套房!
通用类型在编译时是未知的。 因此,您得到编译错误。 这是有道理的,因为无法保证您的*
运算符可以处理您的泛型类型T
一个简单但有教育意义的解决方案可能是添加一个名为Multipliable
的接口并向其添加抽象方法multiply()
,而不是在doAddition
方法中调用该方法。 顺便说一下,你需要改变你的类定义
class MathsExec<T extends Multipliable>
补充说明:
我们必须理解你不能像类*
这样的运算符使用它们,它们只适用于原始类型。
如果必须使用泛型并且必须对泛型类型执行某些操作,则必须保持编译器的快乐并确保该Generic对象具有该方法。 那是通过T extends SomeClass
。
如果您想在不使用接口或抽象类或其他任何东西的情况下练习泛型,最常见的用例是自定义数据结构。 您可能实际上不需要对要存储的数据进行多次操作。 你只需将它们放在你的结构中。
// didn't extend NUMBER because m strictly sending int values
你可以做到这一点。 int
primitives将被装箱为Integer
包装器。 但问题是,算术运算符不适用于泛型类型。 可能有解决方法,但不值得你付出努力。 我宁愿提供重载方法来处理不同的基元类型。
顺便说一下,你应该在doAddition()
方法中取两个参数,然后传递你当前正在编码的k
的值。 这将允许您在任何其他类中重用此方法。
如果你确定T
将被转换为int
你应该从T
到int
进行显式转换。 编译器无法知道这是否真的会发生,所以它会给你这个错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.