平常,我们在使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是基类也就是Object:
在这里,由于我们没有定义泛型类型,编译器就会发出警告,要我们应该参数化对泛型类型列表<E>的引用
这个时候,编译器只能把<T>当作Object使用,这样写完全没有发挥泛型的优势。
当我们定义泛型类型<Integer>后,List<T>的泛型接口变为强类型<Integer>:
在这个,我们定义了泛型类型是<Integer>,它就不会再报编译警告的提示了。
在我们编译的过程中,编译器如果能自动推断出泛型类型,就可以直接省略后面的泛型类型。
List<Integer> list = new ArrayLis<Integer> ();
编译器看到泛型类型List<Integer>就可以自动推断出后面的ArrayList<T>的泛型类型必须是ArrayList<Integer>,因此,可以把代码简写为:
// 可以省略后面的Integer,编译器可以自动推断泛型类型:
List<Integer> list = new ArrayList<>();
除了ArrayList<T>使用了泛型,还可以在接口中使用泛型。
首先,我们写一个泛型接口:
public interface TestOne<T> {
public abstract void test(T t);
}
然后写他的实现方法:
public class TestImpl<T> implements TestOne<T> {
@Override
public void test(T t) {
System.out.println(t);
}
}
接着,就是方法的调用了:
public static void main(String[] args) {
TestImpl<String> testOne = new TestImpl<String>();
testOne.test("泛型接口测试");
}
最后,让我们来看看结果: