尝试使用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
中声明的Object
第二种类型:int
其中T是一个类型变量: T扩展在MathsExec类错误
我理解为什么会出现此错误(操作不兼容的类型),但根据泛型,T
类型应该在执行{{1}之前已转换为Integer
操作......还是有其他解释我应该知道????
答案 0 :(得分:1)
通用类型在编译时是未知的。因此,您得到编译错误。这是有道理的,因为无法保证您的*
运算符可以处理您的通用类型T
。
一个简单但有教育意义的解决方案可能是添加名为Multipliable
的接口并向其添加抽象方法multiply()
,而不是在doAddition
方法中调用该方法。顺便说一句,你需要将类定义更改为
class MathsExec<T extends Multipliable>
其他说明:
我们必须明白你不能像*
这样的运算符用于类,它们只适用于原始类型。
如果必须使用泛型并且必须对泛型类型执行某些操作,则必须让编译器满意并确保该Generic对象具有该方法。这是通过T extends SomeClass
。
如果您想在不使用接口或抽象类或其他任何东西的情况下练习泛型,最常见的用例是自定义数据结构。您可能实际上不需要对要存储的数据进行多次操作。你只需把它们放在你的结构中。
答案 1 :(得分:1)
// didn't extend NUMBER because m strictly sending int values
你可以做到这一点。 int
原语将被装箱到Integer
包装器。但问题是,算术运算符不适用于泛型类型。可能有解决方法,但不值得你付出努力。我宁愿为处理不同的原始类型提供重载方法。
doAddition()
方法中使用两个参数,并传递您当前正在编码的k
的值。这样您就可以在任何其他类中重复使用此方法。
答案 2 :(得分:0)
如果您确定T
将被投放到int
,您应该从T
到int
进行明确投射。编译器无法知道这是否真的会发生,所以它会给你这个错误。