繁体   English   中英

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

[英]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>

补充说明:

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

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

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

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

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

顺便说一下,你应该在doAddition()方法中取两个参数,然后传递你当前正在编码的k的值。 这将允许您在任何其他类中重用此方法。

如果你确定T将被转换为int你应该从Tint进行显式转换。 编译器无法知道这是否真的会发生,所以它会给你这个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM