泛型类中这些语句之间有什么区别?

use*_*042 10 java generics

我还在学习泛型,并有一个问题.假设你有这个通用类:

public class Test<T> {

    public static void main (String[] args) {
        Test t1 = new Test();
        Test<String> t2 = new Test<String>();
        Test t3 = new Test<String>();
    }
}
Run Code Online (Sandbox Code Playgroud)

所有的陈述都汇编了,但我真的不知道是什么让它们与众不同.任何人都可以对这三个陈述给我一个简短的解释.

Per*_*ror 9

Test t1 = new Test();
Run Code Online (Sandbox Code Playgroud)

在这里,您使用的是Raw类型.即,没有Type argument为你的generic class 传递.

编译器应该在这里给你一个警告

测试是原始类型.应参数化对泛型类型Test的引用

    Test<String> t2 = new Test<String>();
Run Code Online (Sandbox Code Playgroud)

在这里你使用泛型.将String作为a传递type argument给你的generic class.

    Test t3 = new Test<String>();
Run Code Online (Sandbox Code Playgroud)

编译器也应该在这里给你一个警告:

  • 测试是原始类型.应参数化对泛型类型Test的引用

与第一种情况相同,但在调用构造函数时使用的是参数化类型.

还有另一个类可以在+ java 7版本中正常工作.

    Test<String> t4 = new Test<>();
Run Code Online (Sandbox Code Playgroud)

如果由于Type Inference使用+ java 7,则此处没有编译器警告

在这种情况下,由于引入了type inference泛型类型,因此您不需要在构造函数调用期间提供泛型类型.