个方法,若子类需要重写父类的方法,就必须注意这一点:


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 Code

List<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
