1.转型和警告:带有泛型类型参数的转换或者使用instanceof判断类型都没有任何效果,因为泛型参数实际上都是以Object存储的。
class AA<T> { private int i = 0; private Object[] o; public AA(int i1) { o = new Object[i1]; } public void a(T t) { o[i++] = t; } @SuppressWarnings("unchecked") public T a1() { return (T) o[--i]; } } public class Test { public static final int INT = 10; public static void main(String[] args) { AA<String> str = new AA<>(INT); for (String s : "A B C D E F G H I J".split(" ")) str.a(s); for (int i = 0; i < INT; i++) { String s = str.a1(); System.out.print(s + " "); } } }
没有@SuppressWarnings注解,编译器将对a1()产生警告,实际没有执行转型。
2.重载:方法重载值在同一个类中的的两个同名方法,两个方法必须具有不同的形参,使编译器能够区分开这两个重载的方法。当有多个泛型标识符时,由于擦除的原因,重载方法将产生相同的类型签名,这样就不会构成重载如下:
public class Test1<W, T> { void f(List<T> v) { } void f(List<W> v) {//将f改名,不重载的话可以编译 } }
两个泛型方法在擦除泛型信息后,只是有相同的参数类型,而返回值不一样,就可以进行重载。
3.自限定的类型:泛型有class AA1<T extends AA1<T>>{ }的写法。自限定要求在继承关系中,强制要求将正在定义的类当做参数传递给基类,为了防止对象的转换出错。