在Java中,为什么无类型调用参数化类型的构造函数会引发编译器警告?

时间:2009-08-25 07:48:53

标签: java generics

在Java中,为什么对参数化类型的构造函数进行无类型调用会引发编译器警告?为什么用静态方法做类似的事情是可以的?例如:

class Test<T> {

    Test() {}

    static <T> Test<T> create() {
        return new Test<T>();
    }

    @SuppressWarnings("unused")
    public static void main(String[] args) {
        Test<String> warning = new Test();  // compiler warning - why?
        Test<String> okay = Test.create(); // no warning here - why?
        Test<String> okay2 = Test.<String>create(); // why doesn't it need this?
    }

}

2 个答案:

答案 0 :(得分:8)

因为您将无类型实例分配给类型变量。你的三个案例:

  1. 因为new Test<String>()是正确的。
  2. 因为Java支持基于返回类型的自动类型推断,即它可以暗示这里的missign泛型参数,并且方法中,所以你通过使用{{{}来制作泛型类型。 1}}(而不只是new Test<T>())。
  3. 因为2.; - )

答案 1 :(得分:1)

Java确实对方法进行了类型推断(这就是第2行工作而第3行不必要的原因),但不是构造函数(这就是第1行给出警告的原因)。

如果Java也对构造函数进行类型推断会很好,但是从Java 6开始它就没有。