基于这两篇博文 总结而成
https://blog.csdn.net/ShierJun/article/details/51253870
https://blog.csdn.net/chendong_/article/details/51970564
1)由于初始化子类,要先初始化父类,所以要么指定父类的类型化参数的类型,要么继承父类的类型化参数(跟抽象类的继承很类似)
2)对于类型化参数的约束,子类应该小于等于其父类。
具体例子:
-
class Son extends Father< T >{}
是错误的,既没有继承父类的类型化参数,也未指定具体的类型化参数
-
class Son< T > extends Father< T >{}
是正确的,因为继承了父类的类型化参数
-
class Son extends Father< Integer >
正确
1)在将父类的类型化参数指定后,就无法使用父类的类型化参数,但是可以使用 由类型化参数定义成员属性
2) 如果子类和 父类的类型化参数同名(按这个例子就都是T),父类指定了类型,子类又增加了同名类型化参数,这时T只是子类的泛型参数,跟父类没有关系 -
class Son< E,T > extends Father< T >{}
额外增加了类型化参数 E -
class Son extends Father
系统默认Father类型化实参为Object ,不过会有warning -
class Son extends Father{
缩小泛型的范围,是准许的,但是不允许扩大泛型的范围 -
class Father<T extends Temp> {} class Son<T extends Temp> extends Father<T>{}
正确 子类继承了父类类型化参数以及参数的约束
-
class Son<E, E super T> extends Father {
错误 若T为Object ,则E类型不存在