泛型中的有界类型

给出以下示例,为什么我需要在reciprocal()中使用doubleValue()(需要扩展Number类),因为java中有自动拆箱功能,可以将存储在num中的数字对象拆箱,并且可以计算num的倒数并返回双精度值?

class gen<T extends Number>{
     T num ;

     gen(T n ){
         num = n ;
     }

     double reciprocal() {
         return (1 / num.doubleValue()) ;
     }
 }


public class demo  {

    public static void main(String[] args) {
        gen<Integer> ob = new gen<Integer>(5) ;
        System.out.println(ob.reciprocal()) ;
    }

}

而且,为什么我不能编写如下所示的相同代码? 附言:以下代码显示了reciprocal()方法中的错误:

class gen<T>{
     T num ;

     gen(T n ){
         num = n ;
     }

     double reciprocal() {
         return (1 / num) ;
         // it shows error in the above step. it says "operator / is undefined
     }
 }


public class demo  {

    public static void main(String[] args) {
        gen<Integer> ob = new gen<Integer>(5) ;
        System.out.println(ob.reciprocal()) ;
    }

}
iCMS 回答:泛型中的有界类型

自动拆箱不是Number类的功能,而是它的子类(IntegerDouble,{ {1}}等)。 Float的许多子类都没有此功能(例如NumberBigInteger等)。

由于第一个代码段中的泛型类型参数可以是扩展了BigDecimal的任何类型,因此它不一定具有自动拆箱功能,因此您必须告诉编译器如何转换Number转换为可以作为除法运算符的操作数的数字基元类型。

在第二个片段中,T没有界限,因此可以是任何东西。 T运算符未为任何任意类型定义。它是为数字操作数定义的。因此,当/为任意引用类型时,编译器无法将/应用于1num

,

Oracle文档(https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)中的拆箱说明为:

当包装类的对象时,Java编译器将应用拆箱 是:

  • 作为参数传递给需要相应原始类型值的方法。
  • 分配给相应原始类型的变量。

就您而言,您没有做这两个操作。

本文链接:https://www.f2er.com/2228118.html

大家都在问