可以等效为Object。
实例化的时候不指定泛型,那么认为此泛型为Object类型
实例化的时候指定泛型
在这个类里边,E就是相应的类型
继承的时候,指定父类泛型,子类就不需要指定泛型了
父类不指定泛型,那么子类也会变成一个 泛型类
应用场合:可以不指定固定类型,在实例化的时候使用
定义的泛型可以是多个参数类型
构造器类型不可以这么写
子类继承的写法
泛型类中的静态方法
因为静态方法是优先于类存在的,所以加载时这个A还没有定义类型,所以会报错!
泛型类中的静态方法不能使用类的泛型,而应该将该方法定义为泛型方法。
1.错误示范:
class demo{ public static T show(T temp) { return temp; } }
2.正确示范:
class demo{ public static T show(T temp) { return temp; } }
原因:
在java中泛型只是一个占位符,必须在传递类型后才能使用。就泛型类而言,类实例化时才能传递真正的类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数时,静态方法就已经加载完成。显然,静态方法不能使用/访问泛型类中的泛型。
这和静态方法不能调用普通方法/访问普通变量类似,都是因为静态申明与非静态申明的生命周期不同。不能定义静态泛型变量
原因:
由于静态变量在java程序一运行时就已经被载入内存,而此时它的类型无法确定,而开辟空间必须知道类型,两者矛盾。
不可以直接创建A[ ]
当前泛型方法对应的泛型参数 和当前所在的类无关才是泛型方法。类中是E,方法中也是E,所以不是泛型方法
注意:不要忘记加 ,如果不加会把T当成一种数据类型,这个数据类型还没有定义。
T的类型是在调用时定义的。
泛型中子类父类关系
list1和list2不存在父类子类关系,是并列关系。
重载
public class demo {
public void fun(List
通配符这种重载方式会报错
List> 是List < Object> List< String> List< Integer>的父类,可以接收任意类型!
public class demo {
public static void main(String[] args) {
List
遍历
用Object
List extends person> 是List< person>的父类,也是List< student>的父类。
class person{}
class student extends person{}
public class demo {
public static void main(String[] args) {
List
泛型的下限
List super person> 是 List< Object> List< person的父类> 的父类。
class person{}
class student extends person{}
public class demo {
public static void main(String[] args) {
List


