我的代码与此类似:
public class Main {
public static void main(String[] args) {
System.out.println(new GenericsTest<Integer>(5).getSquare());
}
}
class GenericsTest<T extends Integer> {
private int square;
public GenericsTest(T t) {
square = t * t;
}
public int getSquare() {
return square;
}
}
IntelliJ IDEA&#39;编辑强调t * t
,如错误,并说:
运营商&#39; *&#39;不适用于&#39;,&#39; T&#39;
但它运行正常。
那么,为什么编辑会警告我编译错误以及如何修改它而不编辑代码?
答案 0 :(得分:4)
一个可能认为这是一个错误,如:
T声明为引用类型,算术运算符+ * /等仅为原语类型定义。所以,当然 - 没有&#34; *&#34;对于对象。
然后它仍然有效,因为T实际上是整数;因此编译器可以 unbox ,结果如下:
t.intValue() * t.intValue()
但是:eclipse并没有在这里给出编译错误;相反它警告关于T extends Integer
没有任何意义的事实(因为类Integer是最终并且无法扩展! )
javac 相同:您的代码编译正常 - 没有错误,没有警告。
结论:实际上,您的源代码似乎正确。 java编译器足够聪明,可以理解只有Integers可以进入 - 然后t * t
是可能的!
所以真正的错误是你在IntelliJ中收到错误信息!因此唯一的解决方案&#34;我明白了:写一封针对JetBrains的bug请求。
答案 1 :(得分:2)
您的ide错误不正确。 在类型擦除之后,您的方法应该是:
public GenericsTest(Integer t) {
square = t * t;
}
因为通用T被声明为<T extends Integer>
。
Integer
可以取消装箱到int
。