public class Test {
public static void main(String[] args) {
//泛型 参数化类型
//泛型出现的一个很重要的原因,就是需要创建能够容纳任何类型的容器类的需求
//java5之前用的是object来存储。但是这样会导致可以存多种类型
//我们确实需要容器能够支持不同类型,但是具体存储的时候,我们希望只能存储一种,以防止错误发生,然而object会接受任何类型
//这就导致泛型的出现 泛型的本质就是暂时不指定类型,稍后制定类型,一旦指定,就必须存储这一种类型的对象了
//元组用来存储几个对象,能够一次性打包返回多个对,他的实现就是依赖与java的泛型机制
//元组可以通过继承不断的扩展存储数量
//Java泛型的一个缺陷:基本数据类型无法作为泛型参数,但是借助于Java的自动打包和自动拆包机制,这种局限也不是问题
//泛型方法独立于泛型类 如果可能尽量使用泛型方法
//static方法无法访问类的泛型参数,这很好理解,因为确定泛型参数的具体类型需要在创建对象时,而静态方法不依赖于创建对象,因此
//如果静态方法需要泛型,那么只能使用方法泛型参数
//要定义泛型方法,只需要将泛型参数列表置于返回值之前即可,并且用尖括号括起来
//当我们使用泛型类时,必须声明参数类型的具体类型,但是使用泛型方法时,不必指定泛型参数具体类型,编译器会类型参数推断,因此调用和普通方法一样
//当然类型方法使用时也可以指定参数,就是在点操作符和方法名之间插入尖括号
//class类型生成的class对象 如果是一个类 那么两个对象引用实际上指向的是一个对象 也就是一个类型对应一个class对象 这点很重要
//理解java泛型的擦除机制
//为了消除java泛型机制带来的不便,可以给泛型指定边界。比如<T extends Hash> 这个边界表示泛型只能接受Hash和Hash的导出类
//为什么java使用泛型,本质上是为了兼容性,因为java开始设计的时候没有泛型,1.5之后才有泛型机制,因此为了兼容非泛型类库,只能使用泛型擦除机制
//因此类库的使用既可以支持泛型,也可以不写泛型,因此泛型使用不是强制的
}
}
//两种类不能被继承,一种是final类,一种是构造器为private的类
class Person{
private Person() {
}
}
class Student extends Person{
}