Java泛型。我有一个编译错误,但代码工作正常

时间:2017-07-10 11:45:22

标签: java generics

我的代码与此类似:

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;

但它运行正常。

那么,为什么编辑会警告我编译错误以及如何修改它而不编辑代码?

2 个答案:

答案 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