java中的有界类型
我无法理解为什么这段代码没有编译java中的有界类型,java,generics,bounded-types,Java,Generics,Bounded Types,我无法理解为什么这段代码没有编译 public class Room { public static void main(String[] args) { Double[] ar = {1.1,2.23,3.56,4.23,5.90,6.88,7.99,8.09,9.88,10.99}; Average<Double> tt = new Average<>(ar); tt.summ(); } } class
public class Room {
public static void main(String[] args) {
Double[] ar = {1.1,2.23,3.56,4.23,5.90,6.88,7.99,8.09,9.88,10.99};
Average<Double> tt = new Average<>(ar);
tt.summ();
}
}
class Average<T extends Double> {
T[] arr;
T sum;
Average(T[] num) {
arr = num;
}
void summ() {
for (T i : arr) {
sum = sum + i;//Shows incompatible types
System.out.println(sum);
}
}
}
公共教室{
公共静态void main(字符串[]args){
双[]ar={1.1,2.23,3.56,4.23,5.90,6.88,7.99,8.09,9.88,10.99};
平均tt=新平均值(ar);
tt.summ();
}
}
班级平均{
T[]arr;
T和;
平均值(T[]num){
arr=num;
}
无效总和(){
对于(TI:arr){
sum=sum+i;//显示不兼容的类型
系统输出打印项数(总和);
}
}
}
编译器错误状态为:
Room.java第18行出错:
类型不匹配:无法从双精度转换为T
有人能解释一下为什么这段代码没有编译吗???这个泛型类型参数没有这个界限:
class Average<T extends Double>
类平均值
因为Double是final,不能有子类型
因此,您最好删除泛型类型参数T,并用Double everywhere替换T。因为我不知道您的代码应该归档什么,所以我不确定这个答案是否正确,但一个快速修复方法(至少可以避免语法错误)是替换以下行:
T sum;
与:
这样,您的输出就是所有双精度的增量总和,一个接一个。Eran是正确的
java.lang.Double
是final
,因此使用类型参数T extensed Double
是没有意义的。满足这一点的唯一可能类型是Double
本身,因此您也可以删除类型参数,直接使用Double
(或者更好的是:原语类型Double
)
代码无法编译的原因是您试图对类型为t
的对象使用+
运算符
Java编译器不是很聪明,它注意到T
只能是Double
,因此它可以自动(通过自动取消装箱和装箱)将值转换为Double
,以进行计算
<>你可能来自C++背景,你使用C++模板。java泛型与C++模板不一样工作;Java中的泛型类型不是生成代码的模板。
+
是用于数字或字符串的算术运算符,但不能用于对象
类型。如果要使用+
运算符,两个操作数应具有相同的类型
class Average<T extends Double> {
T[] arr;
double sum = 0;
Average(T[] num) {
arr = num;
}
void summ() {
for (T i : arr) {
sum += (Double)i;//Shows incompatible types
System.out.println(sum);
}
}
}
类平均值{
T[]arr;
双和=0;
平均值(T[]num){
arr=num;
}
无效总和(){
对于(TI:arr){
sum+=(Double)i;//显示不兼容的类型
系统输出打印项数(总和);
}
}
}
String args[]请在类型上写括号,而不是变量,因为它属于该类型。此外,请包括编译错误。@Turing85-不,这不是解决方案…仍然没有编译。您甚至没有包括错误。@RajMalhotra我知道这不是解决方案。这只是对您的编码风格的评论。为了解决您的问题,我们需要实际的编译错误。@Eran,但是为什么代码没有编译?。在这种情况下,OP可能希望用double
替换T
,而不是double
,这样可以消除编译错误。@Eran,但为什么代码没有编译?。即使我写,然后还展示了它的编译error@CodebenderOP的代码给出了一个编译错误-类型不匹配:无法在sum=sum+i行上从double转换为T
如果我们可以教java编译器在编译过程中使用哪种类型,那么它就可以work@RajMalhotra阅读安迪·布朗给出的“可能重复的…”评论。这应该可以回答您的问题。“这样它就可以自动(通过自动取消装箱和装箱)将值转换为双精度值来进行计算。”-这是实际问题的实际答案
class Average<T extends Double> {
T[] arr;
double sum = 0;
Average(T[] num) {
arr = num;
}
void summ() {
for (T i : arr) {
sum += (Double)i;//Shows incompatible types
System.out.println(sum);
}
}
}