java - 自动装箱/自动拆箱不适用于有界类型参数

标签 java generics autoboxing

这是我正在尝试做的事情:

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 不能是数字运算符的操作数。

以下代码将无法通过编译,原因与您的代码完全相同 - 对于参数类型 double、Number ,运算符 += 未定义

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

关于java - 自动装箱/自动拆箱不适用于有界类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010281/

相关文章:

java - 如何在 Java 中播放声音?

java - 黑莓 SQLite : Attach one SQLite database to another

java - 尝试从其他类访问 ArrayList 时出现 NullPointerException

java - 未经检查的类型转换 : Wildcard wrapped by Class to another type wrapped by Class

go - 将类型(int、float 等)转换为 `T` [go1.18]

javascript - Javascript 不支持参数多态性(通用编程)?

java : Understanding Arrays. asList(T...array) 原始类型方法

java - 为什么不为泛型自动装箱 Java 基本类型?

java - 三元运算符无法识别 Eclipse 中的编译错误

java - 如何在 java.time 的模式字符串中用时区格式化日期?