【问题标题】:Wildcard Arguments in generics泛型中的通配符参数
【发布时间】:2020-06-02 10:04:49
【问题描述】:

在下面的程序中,absEqual() 方法中的步骤ob.num.doubleValue() 是如何工作的?它想做什么?

class NumericFns<T extends Number>{
     T num;  

     NumericFns(T n ){
         num = n ;
        }

     boolean absEqual(NumericFns<?> ob) {
         if (Math.abs(num.doubleValue())== 
                 Math.abs(ob.num.doubleValue())) 
             return true ;
         return false ;
     }
}

public class demo  {

    public static void main(String[] args) {
        NumericFns<Integer> iob = new NumericFns<Integer>(6) ;
        NumericFns<Double> dob = new NumericFns<Double>(-6.0) ;
        if(iob.absEqual(dob))
            System.out.println("Absolute Values are equal") ;
        else
            System.out.println("They differ") ;         
    }    
}

【问题讨论】:

  • NumericFns 中的每个 T 至少是一个 Number。在不知道具体类型的情况下,您总是知道它至少是一个Number
  • 请注意,尽管此问题的标题当前指的是通配符参数,但您实际上并未在问题中使用通配符 (&lt;?&gt;)。

标签: java oop generics


【解决方案1】:

ob 是您要与当前对象进行比较的对象。 ob.num 是您的 NumericFns 类存储的 T extends Number 类型的泛型。 ob.num.doubleValue() 只是给你 ob.num 的 double 值。

if 语句只接受两个双精度值并检查它们是否相同。

【讨论】:

    【解决方案2】:

    类型参数T有一个上限Number,意味着它等于类型T或其子类型。因此,您可以在T 类型的变量上调用Number 的方法,例如本例中的doubleValue() 方法。

    Bounded Type Parameters的解释。

    因此,当且仅当两个数字的双精度值相同时,此方法才会返回 trueInteger 值 1 和 Double 值 1.0 可能就是这种情况。

    注意,方法实现可以简化为

         boolean absEqual(NumericFns<?> ob) {
             return Math.abs(num.doubleValue()) == Math.abs(ob.num.doubleValue()));
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多