java - 在java中使类泛型化

标签 java collections

 public class ClassGenericParameterized<T> {

    public void add(T t1, T t2){
        //System.out.println(t1+t2);
        System.out.println(Integer.parseInt(t1.toString()) + Integer.parseInt(t2.toString()));          
    }

    public void multiply(T t1, T t2){
        System.out.println(Integer.parseInt(t1.toString()) * Integer.parseInt(t2.toString()));          
    }

    public void subtract(T t1, T t2){
        System.out.println(Integer.parseInt(t1.toString()) - Integer.parseInt(t2.toString()));          
    }

    public void division(T t1, T t2){
        System.out.println(Integer.parseInt(t1.toString()) / Integer.parseInt(t2.toString()));          
    }

    public static void main(String[] args) {

        ClassGenericParameterized<Integer> ob = new ClassGenericParameterized<Integer>();
        ob.add(1,2);
        ob.multiply(2, 4);
        ob.subtract(15, 6);
        ob.division(6, 3);

    }
}

在java中使类泛型化的逻辑和需求是什么
当替换语句时

 ClassGenericParameterized<Integer> ob = new ClassGenericParameterized<Integer>()

ClassGenericParameterized<Double> ob = new ClassGenericParameterized<Double>()

给出

Error(The method add(Double, Double) in the type ClassGenericParameterized<Double> is not applicable for the arguments (int, int))

按照我的想法,这是因为在 add 方法内部编写的语句为 Integer.parseInt(t1.toString()) + Integer.parseInt(t2.toString())

所以再次尝试替换该语句

System.out.println(Integer.parseInt(t1.toString()) + Integer.parseInt(t2.toString()));

System.out.println(t1+t2)

这给出了

Error(The operator + is undefined for the argument type(s) T, T). 

那么这怎么能成为真正意义上的通用呢?有人可以解释一下为什么会发生这种情况以及如何纠正此错误以实现我的功能吗?

最佳答案

在这种情况下,泛型不太适合。原因:

  • 您不能简单地声明任何能够进行加法、减法、乘法或除法的类型。 T上限为 Object .

  • 如果将界限设置为 <T extends Number> ,这仍然行不通,因为您不能保证您可以将该参数中想要的任何内容自动装箱为类型 T该类是绑定(bind)的。

最终,您将需要考虑使用 Number相反作为你的参数。自 Number是所有数字包装器的父类,包括 BigIntegerBigDecimal ,您可以利用它。

public class NumberOperations {

    public void add(Number t1, Number t2){
        //System.out.println(t1+t2);
        System.out.println(Integer.parseInt(t1.toString()) + Integer.parseInt(t2.toString()));
    }

    public void multiply(Number t1, Number t2){
        System.out.println(Integer.parseInt(t1.toString()) * Integer.parseInt(t2.toString()));
    }

    public void subtract(Number t1, Number t2){
        System.out.println(Integer.parseInt(t1.toString()) - Integer.parseInt(t2.toString()));
    }

    public void division(Number t1, Number t2){
        System.out.println(Integer.parseInt(t1.toString()) / Integer.parseInt(t2.toString()));
    }

    public static void main(String[] args) {

        NumberOperations ob = new NumberOperations();
        ob.add(1, 2);
        ob.multiply(2, 4);
        ob.subtract(15, 6);
        ob.division(6, 3);

    }
}

关于java - 在java中使类泛型化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32129531/

相关文章:

java - 用 java 8 foreach 替换 for 循环来更新值

Scala:将空序列与 Nil 匹配

java - <? 之间的区别 super T> 和 <?在 Java 中扩展 T>

java - Java 中的 HashSet 和 TreeSet

java - 从多个 HashMap 对象创建 SortedSet 的最佳方式

java - 集成测试的 Spring Boot 身份验证

Java Servlet 以状态码 HTTP/500 运行

java - 求图像 Java 的平均值

java - 对于这种情况,最佳数据结构的选择是什么?

java - Postgres 中止事务并忽略查询,直到事务结束,是否可以在事务回滚之前处理事务?