没有区别,因为T默认是extends Object的,反编译之后就是都是
方法泛型调用
在JVM加载字节码不存在,只是编译期存在
使用泛型类JVM加载字节码存在 具体泛型类型,没有所谓的占位符(运行期存在)
声明的泛型方法 中的是存在jvm字节码的只不过这个E类型是Object,有占位符(运行期存在)
泛型类定义的是存在JVM加载的字节码文件的只不过类型为Object,有占位符(运行期存在)
extends Number> 被jvm加载 运行期存在
在方法上 extends Number> 一样被jvm加载 运行期存在
super Number> 被jvm加载 运行期存在
> 被jvm加载 运行期存在
extends T> 被jvm加载 运行期存在
方法上定义的List 运行期存在
运行期存在
> 存在 >
>存在>
不存在
>存在 >
Class 存在 Class 这个T类型是Number类型 这个T必须是满足是继承Number类型或Number类型本身,并且实现了List接口 super String> 这个T Class里面本身定义的是Object类型,这里存放进行的T一定满足是继承Number或Number类型本身 &实现了List接口 super String> 这个List里面的元素必须是String的本身或String的父类。List本身定义的是Object类型
List super的元素必须满足 String类或String父类 jvm存在List
多个&之间使用的时候必须要满足条件
Class> 存在
Class extends Number> 存在 类型是Number或 Number的子类 跟 使用?当前类泛型的定义没有关系
使用?跟当前类定义的泛型没有关系
get出来的是Number类型
堆空间的对象元素是有泛型的,栈空间指向这个堆空间对象情况下
(使用没有指定泛型类情况下)类定义的泛型 跟实例化出来该类型的对象无关系
在方法上List list = new ArrayList();
在方法上List list = new ArrayList();
list 跟 ArrayList都是同一种类型
但里面的泛型元素就有关系了(没有指定泛型)会出现类型转换错误
在使用限定泛型就会进行泛型检测,会编译不通过
不指定泛型,该对象变量,什么泛型类型的同类型都可以指向,虽然它们里面的泛型不是同一个类型
T类型被标识为Integer类型
但只要涉及Class里面定义的泛型T使用,如果使用的时候T类型不匹配类型就会错误,没有使用就无所谓
返回的元素都是当前类定义的泛型类型
原本Class类定义的是T是Object类型
在别的类定义了一个泛型CurrentClass 就是 CurrentClass
那么使用在CurrentClass这个Class类的时候 Class 就是 Class 这里的T指代T:Integer 而不是Object了
这个T就是 当前泛型类定义的 T:Integer类型
在CurrentClass操作Class泛型T类型都是当前类定义的T:Integer类型,那么Class类源码定义的泛型都是当中Integer类型使用
使用T泛型类型必须符合Integer相关语法操作,比如不能从String类型转换到Integer类型
默认就是
Class里的方法返回的T类型编译器就当做是Integer
这个T就是Integer
在方法泛型上会进行泛型检查,没有类泛型
当方法定义为泛型,类也定义为泛型,方法里面的,方法内部T是使用方法泛型的T
此时必须在main方法指定泛型才会进行泛型检查,类使用的泛型检测类的,方法使用的泛型检测方法的泛型的
当类没有定义泛型的时候,直接使用方法泛型里使用直接检查,不管有没有指定泛型都是有泛型约束
当类定义泛型的时候,方法也定义泛型,在main方法不使用类泛型,方法泛型也不会进行泛型检查,
不会进行泛型检查,但是方法内部都是方法定义的泛型类型。
因为方法泛型检查是按照类的实例来的,否则方法泛型定义为静态方法泛型
类泛型里面使用方法参数泛型,必须在main方法指定泛型才会检查,否则无泛型约束
没有方法泛型,有类泛型,方法定义中的T就是使用类的(直接泛型约束),否则就是使用方法泛型的
此图无泛型约束
Test
Set