使用Generic和primitive类型执行操作不起作用

时间:2014-03-10 06:21:10

标签: java generics

尝试使用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类错误

中声明的Object

我理解为什么会出现此错误(操作不兼容的类型),但根据泛型,T类型应该在执行{{1}之前已转换为Integer操作......还是有其他解释我应该知道????

P.S:请放轻松,JAVA不是我强大的套房!!

3 个答案:

答案 0 :(得分:1)

通用类型在编译时是未知的。因此,您得到编译错误。这是有道理的,因为无法保证您的*运算符可以处理您的通用类型T

一个简单但有教育意义的解决方案可能是添加名为Multipliable的接口并向其添加抽象方法multiply(),而不是在doAddition方法中调用该方法。顺便说一句,你需要将类定义更改为

class MathsExec<T extends Multipliable>

其他说明:

  1. 我们必须明白你不能像*这样的运算符用于类,它们只适用于原始类型。

  2. 如果必须使用泛型并且必须对泛型类型执行某些操作,则必须让编译器满意并确保该Generic对象具有该方法。这是通过T extends SomeClass

  3. 如果您想在不使用接口或抽象类或其他任何东西的情况下练习泛型,最常见的用例是自定义数据结构。您可能实际上不需要对要存储的数据进行多次操作。你只需把它们放在你的结构中。

答案 1 :(得分:1)

// didn't extend NUMBER because m strictly sending int values

你可以做到这一点。 int原语将被装箱到Integer包装器。但问题是,算术运算符不适用于泛型类型。可能有解决方法,但不值得你付出努力。我宁愿为处理不同的原始类型提供重载方法。

顺便说一下,您应该在doAddition()方法中使用两个参数,并传递您当前正在编码的k的值。这样您就可以在任何其他类中重复使用此方法。

答案 2 :(得分:0)

如果您确定T将被投放到int,您应该从Tint进行明确投射。编译器无法知道这是否真的会发生,所以它会给你这个错误。