Java泛型复数类ComplexNum中add方法报错如何解决
问题根因
你写的泛型复数类add方法编译报错,核心问题有3个:
- Java泛型存在类型擦除机制,你没有给泛型参数
T加任何上界限定,编译器默认将T视为Object类型,而Java中+运算符不支持直接作用于两个Object对象,因此r + c2.r、i + c2.i这两行代码会直接编译失败。 - add方法的参数使用了原始类型
ComplexNum c2,没有声明泛型参数,会绕过泛型类型检查,存在类型安全隐患。 - 你在main方法中尝试将
ComplexNum<Integer>和ComplexNum<Double>类型的对象相加,且直接将返回值赋值给ComplexNum<Double>类型变量,原始的add方法返回值没有指定泛型,无法匹配目标类型。
注意:Java泛型不支持运算符重载,所有数值类型的泛型对象都无法直接用
+/-等运算符做计算,必须先转换为基础数值类型再运算。
修复后代码
class ComplexNum<T extends Number>{ T i; T r; public ComplexNum (T r , T i){ this.r = r; this.i = i; } // 支持传入任意数值类型的复数做加法,统一返回Double类型复数结果 public ComplexNum<Double> add(ComplexNum<? extends Number> c2){ double realRes = this.r.doubleValue() + c2.r.doubleValue(); double imagRes = this.i.doubleValue() + c2.i.doubleValue(); return new ComplexNum<>(realRes, imagRes); } @Override public String toString() { return this.r + " + " + this.i + "i"; } } class Main{ public static void main(String[] args) { int n1 = 1; int n2 = 3; double d1 =4.4; double d2 = 5.4; ComplexNum<Integer> c1 = new ComplexNum<>(n1, n2); ComplexNum<Double> c2 = new ComplexNum<>(d1, d2); ComplexNum<Double> c3 = c1.add(c2); System.out.println(c1 + " + " + c2 + " = "+ c3) ; } }
修复点说明
- 给泛型参数添加上界限定
<T extends Number>,确保存入的实部、虚部都是数值类型,可调用Number类自带的doubleValue()方法转换为基础类型做计算。 - add方法参数使用上界通配符
? extends Number,支持传入Integer、Double等任意数值类型的复数对象,消除原始类型的泛型警告。 - 计算时不直接对泛型对象使用
+运算符,统一将实部、虚部转为double值计算,返回明确的ComplexNum<Double>类型,和main方法中的变量类型完全匹配。 - 代码运行后输出结果为:
1 + 3i + 4.4 + 5.4i = 5.4 + 8.4i,符合预期。
内容的提问来源于stack exchange,提问作者Jyothish Vijay
相关产品推荐
相关产品推荐

