繁体   English   中英

自动装箱/自动拆箱不适用于有界的Type参数

[英]Autoboxing/Auto-unboxing is not working for bounded Type parameter

这是我想做的事情:

class MyNumbers<T extends Number>{

    private T[] array;

    MyNumbers(T[] array){
            this.array = array;
        }
    public void setArray(T[] array){
        this.array = array;
    }
    public T[] getArray(){

            return this.array;
        }


    public double avarage(){

            double avg =0.0;
            double sum =0.0;
            for(T t: array){
                    sum += t.doubleValue(); // working
                    sum = sum+ t; // not working

                }
                return sum/array.length;            }
}

按照自动装箱和拆箱规则, sum = sum+ t; 应该管用。 但不能作为T已经通过Number类扩展。

这是我尝试以下类型的内容:

public class BoundedTypeParam{

    public static void main(String [] args){

        Integer[] ints = {1,2,3,4,5,6};
        MyNumbers<Integer> stats4Ints = new MyNumbers<>(ints);

        System.out.println("Avg is same : "+ stats4Ints.avarage());

    }

}

我所缺少的任何规则/概念。

PS。 我知道可修改的类型,擦除

这与泛型无关。 如果将T替换为Number,它将无法正常工作。

没有从Number类型到某些基本类型的拆箱转换,因此Number不能是数字运算符的操作数。

以下代码由于与代码完全相同的原因而无法通过编译- The operator += is undefined for the argument type(s) double, Number

Number n = 5;
double sum = 0.0;
sum += n;

数组不会被擦除,类型强制也根本不适用于它们。 double[]永远不会与Double[]相同,并且两者都不强制转换为Number[]

通过像这样绑定类型变量:

class Example<T extends Number> {
  private T[] arr;
}

您在运行时实际拥有的是:

class com.Example {
  private Number[] arr;
}

这又意味着以下代码:

for(T t: array) {
  <...snip...>
}

用以下代码编译:

for (Number t: array) {
  <...snip...>
}

如您所见,没有关于数字类型的信息,并且Java没有定义任何对Number类起作用的运算符,任何执行自定义Number的库甚至JDK本身使用BigIntegerBigDecimal

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM