使用通配符泛型实现compareTo

时间:2013-10-29 14:25:06

标签: java generics wildcard compareto

我必须实现一个类ComplexNumber。它有两个通用参数TU,它们必须来自继承自Number类的某个类。 Complex类有2个字段(实例变量):实部和虚部,必须实现这些方法:

  1. ComplexNumber(T real, U imaginary) - 构造函数
  2. getReal():T
  3. getImaginary():U
  4. modul():double - 这是复数模数
  5. compareTo(ComplexNumber<?, ?> o) - 此方法根据2个复数的模数进行比较
  6. 我已经实现了除最后一个compareTo之外的所有这些方法,因为我不知道如何使用这些通配符进行操作。

    这是我的代码:help here - pastebin

    class ComplexNumber <T extends Number,U extends Number> implements Comparable<ComplexNumber> {
    
        private T real;
        private U imaginary;
    
        public ComplexNumber(T real, U imaginary) {
            super();
            this.real = real;
            this.imaginary = imaginary;
        }
    
        public T getR() {
            return real;
        }
    
        public U getI() {
            return imaginary;
        }
    
        public double modul(){
    
            return Math.sqrt(Math.pow(real.doubleValue(),2)+ Math.pow(imaginary.doubleValue(), 2));
    
        }
    
    
    
        public int compareTo(ComplexNumber<?, ?> o){
    
            //HELP HERE 
        }
    
    
    
    
    }
    

    有人帮忙用这种方法吗?

3 个答案:

答案 0 :(得分:2)

由于您只需要比较模数,因此您不必关心类型参数。

@Override
public int compareTo(ComplexNumber<?, ?> o) {
    return Double.valueOf(modul()).compareTo(Double.valueOf(o.modul()));
}

但是,您还必须在类型声明中添加通配符

class ComplexNumber <T extends Number,U extends Number> implements Comparable<ComplexNumber<?, ?>>

答案 1 :(得分:0)

试一试:

class ComplexNumber<T extends Number, U extends Number> implements Comparable<ComplexNumber<T, U>> {
  @Override
  public int compareTo(ComplexNumber<T, U> o) {
    return 0;
  }
}

答案 2 :(得分:0)

看起来你的两个参数都可以处理扩展java.lang.Number的类,并且所有具体的类都与你想要的方式进行比较如下:

@Override
public int compareTo(ComplexNumber o) {

    if (o.real  instanceof BigInteger && this.real instanceof BigInteger) {
        int realCompValue = ((BigInteger)(o.real)).compareTo((BigInteger)(this.real));
        if (realCompValue == 0 ) {
            return compareImaginaryVal(o.imaginary, this.imaginary);
        } else {
            return realCompValue;
        }
    } else if (o.real  instanceof BigDecimal && this.real instanceof BigDecimal) {
        int realCompValue = ((BigDecimal)(o.real)).compareTo((BigDecimal)(this.real));
        if (realCompValue == 0 ) {
            return compareImaginaryVal(o.imaginary, this.imaginary);
        } else {
            return realCompValue;
        }
    } 

    // After checking all the Number extended class...
    else {
        // Throw exception.
    }
}

private int compareImaginaryVal(Number imaginary2, U imaginary3) {
    // TODO Auto-generated method stub
    return 0;
}