Autoboxing/Auto-unboxing 不适用于有界类型参数
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 class .
进行扩展
这是我尝试使用以下类型:
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());
}
}
我遗漏的任何 rule/concept。
PS。我知道可具体化的类型,erasure
这与泛型无关。如果你把 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
类 的运算符,这证明了任何使用自定义数字的库,甚至 JDK 本身带有 类 的库,例如 BigInteger
和 BigDecimal
.
这是我正在尝试做的事情:
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 class .
这是我尝试使用以下类型:
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());
}
}
我遗漏的任何 rule/concept。
PS。我知道可具体化的类型,erasure
这与泛型无关。如果你把 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
类 的运算符,这证明了任何使用自定义数字的库,甚至 JDK 本身带有 类 的库,例如 BigInteger
和 BigDecimal
.