个方法,若子类需要重写父类的方法,就必须注意这一点:
1 public class A1 extends Apple<String>{ 2 //正确重写了父类的方法,返回值 3 //与父类Apple<String>的返回值完全相同 4 public String getInfo(){ 5 return "子类" + super.getInfo(); 6 } 7 /* 8 //下面方法是错误的,重写父类方法时返回值类型不一致 9 public Object getInfo(){ 10 return "子类"; 11 } 12 */ 13 } View Code若使用Apple类没有传入实际的类型参数,java编译器可能发出警告:使用了未经检查或不安全的操作——这就是泛型检查的警告。若希望看到该警告的更详细信息,可
以为javac命令增加-Xlint:unchecked选项来实现。此时系统会把Apple<T>类里的T类型参数当成Object类型处理:
1 public class A2 extends Apple{ 2 //重写父类的方法 3 public String getInfo(){ 4 //super.getInfo()方法返回值是Object类型 5 //所以加toString()才返回String类型 6 return super.getInfo().toString(); 7 } 8 } View Code并不存在泛型类:
1 import java.util.List; 2 import java.util.ArrayList; 3 4 public class GeneicCompare{ 5 public static void main(String[] args){ 6 //分别创建List<String>对象和List<Integer>对象 7 List<Integer> list1 = new ArrayList<>(); 8 List<String> list2 = new ArrayList<>(); 9 //调用getClass()方法来比较list1和list2的类是否相等 10 System.out.println(list1.getClass() == list2.getClass()); 11 } 12 } View CodeList<String> 和 List<Integer>的类是相同的,不管泛型的实际类型参数是什么,它们在运行时总有同样的类。
不管为泛型类型参数传入哪一种类型实参,对Java来说,它们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此不能在静态方法、静态初始化块或者静态变量
的声明和初始化中使用类型参数:
1 public class R<T>{ 2 //下面代码是错误的,不能在静态变量中使用类型形参 3 static T info; 4 T age; 5 public void foo(T msg){ } 6 //下面代码是错误的,不能在静态方法声明中使用类型形参 7 public static void bar(T msg){ } 8 } View Code