【问题标题】:Operation Problems in Java Generic [closed]Java Generic 中的操作问题
【发布时间】:2013-10-28 15:33:18
【问题描述】:

我在学习 Java Generic 时遇到了一些问题:

interface calculator<T, R> {
 public void execute(T t, R r);
}

class executeAdd<T, R> implements calculator<T, R> {
    private T first;
    private R second;

    public executeAdd(T first, R second) {
        super();
        this.first = first;
        this.second = second;
    }

    @Override
    public void execute(T t, R r) {
        // TODO Auto-generated method stub

        Object o = t + r //  ERROR ! What i could do it ?

    }  
}

【问题讨论】:

  • 还有什么问题???
  • 您正在尝试添加两个对象,您无法添加对象
  • 你不能这样做。你不能在任何不是原语或Strings 的东西上使用+ 运算符。
  • @StefanBeike 问题出现在代码注释中
  • @LakatosGyula 您不能使用抽象 java.lang.Number 类的引用添加对象,但您可以将扩展此类的具体类型(DoubleInteger 等)添加在一起。不知道你是不是这个意思,只是想澄清一下。

标签: java generics


【解决方案1】:
Object o = t + r

对象不能(在 99% 的情况下)加在一起,因为这样的行为对于大多数对象来说毫无意义。这不是泛型特有的。

您确定要使用泛型,因为您似乎对 T 和 R 表现得好像它们是双精度数(或另一个数字原语)

【讨论】:

    【解决方案2】:

    如果这是一个数字计算器,我想你想要的是:

    interface Calculator<T extends Number, R extends Number> {
        public void execute(T t, R r);
    }
    
    class ExecuteAdd<T extends Number, R extends Number> implements
            Calculator<T, R> {
        private final T first;
        private final R second;
    
        public ExecuteAdd(final T first, final R second) {
            this.first = first;
            this.second = second;
        }
    
        @Override
        public void execute(final T t, final R r) {
            // Check if integer, then add together as integer
            if (t instanceof Integer && r instanceof Integer) {
                final Integer result = t.intValue() + r.intValue();
            } else if (...) {
                // And so on with all subclasses of Number
            }
        }
    }
    

    这首先将泛型声明为Number(它是Java 中所有数字类的父类)的子类。这样你首先要确保传递的对象实际上可以被添加。

    这不是一个非常优雅的解决方案,而且它也没有考虑将不同的Number 子类添加在一起(例如整数和浮点数)。

    【讨论】:

    • 我想您还可以通过在两个 Number 对象上使用 Number#doubleValue() 来避免 if 语句,从而为您提供执行算术的通用类型或类似的东西。不知道这是否有任何不利因素。
    • 嗯,BigInteger 呢?转换为double 也会使您丢失不能精确表示为浮点值的整数值。
    • 是的,BigIntegerBigDecimal 是一种选择;任何提供算术运算方法的东西。转换为 double 确实会导致您丢失一个整数值 (10 -> 9.999999 ....),这是真的。我想你必须 round() 但这也可能不是 100% 的时间(并且变得不必要地复杂)。
    • 谢谢你们!!!!!!!
    【解决方案3】:

    您可以将calculator 定义为

    interface calculator<T extends Number, R extends Number>

    这样您就可以使用.xValue 方法进行计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多