基本概念

泛型指可以把类型参数化,这个能力可以使我们定义带类型参数的泛型类,泛型接口,泛型方法,随后编译器会用唯一的具体类型替换它.

主要优点是在编译时而不是运行时检测出错误.泛型类或方法允许用户指定可以和这些类或方法一起工作的对象类型.

如果试图使用一个不相容的对象,编译器就会检测出这个错误.

Java的泛型通过擦除法实现.编译时会用类型实参代替类型形参进行严格的语法检查,然后擦除类型参数,生成所有实例类型共享的唯一原始类型.

下面声明一个泛型类Wrapper,接受一个形式化类型参数T

public class Wrapper<T>  {

}

T是一个类型变量,可以是Java中的任何引用类型.

RTTI:运行时类型识别.

类型信息是通过Class类(类名为Class的类)的对象表示的,Java利用Class对象来执行RTTI。

每个类都有一个对应的Class对象,每当编写并编译了一个类,就会产生一个Class对象,这个对象当JVM加载这个类时就产生了。

获取Class对象的方法:如果获得一个对象的引用o,通过o.getClass()方法获得这个对象的类型的Class对象

泛化的Class引用

//非泛化的Class引用(即不带类型参数的Class引用)可指向任何类型的Class对象,但这样不安全
Class clz ;     //注意警告, Class is a raw type. References to generic type Class<T> should be parameterized
clz= Manager.class; //OK
clz = int.class; //OK

//有时我们需要限定Class引用能指向的类型:加上<类型参数>。这样可以可以强制编译器进行额外的类型检查
Class<Person> genericClz;    //泛化Class引用,Class<Person>只能指向Person的类型信息, <Person>为类型参数
genericClz = Person.class;  //OK
//genericClz = Manager.class; //Error,不能指向非Person类型信息。注意对于类型参数,编译器检测时不看继承关系。

//能否声明一个可用指向Person及其子类的Class对象的引用?为了放松泛化的限制,用通配符?表示任何类型,并且与extends结合,创建一个范围
Class<? extends Person> clz2;  //引用clz2可以指向Person及其子类的类型信息
clz2 = Person.class;
clz2 = Employee.class;
clz2 = Manager.class;
//注意Class<?> 与Class效果一样,但本质不同,一个用了泛型,一个没有用泛型。 Class<?> 等价于Class<? extends Object > 

我很好奇