Java泛型反编译
<T> <T extends Object> 没有区别,因为T默认是extends Object的,反编译之后就是都是<T Object>

方法泛型调用
在JVM加载字节码不存在<Goods>,只是编译期存在




使用泛型类JVM加载字节码存在<Goods> 具体泛型类型,没有所谓的占位符(运行期存在)



声明的泛型方法 中的<E>是存在jvm字节码的只不过这个E类型是Object,有占位符(运行期存在)



泛型类定义的<T>是存在JVM加载的字节码文件的只不过类型为Object,有占位符(运行期存在)


<? extends Number> 被jvm加载 运行期存在 <+ Number>



在方法上<? extends Number> 一样被jvm加载 运行期存在 <+ Number>



<? super Number> 被jvm加载 运行期存在 <- Number>



<?> 被jvm加载 运行期存在 <*>



<? extends T> 被jvm加载 运行期存在 <+TT>



方法上定义的List<T> 运行期存在<TT>



<T extends String> 运行期存在 <T String>



<T extends Number & List<T> > 存在 <T:Number,List<TT>>



<T extends Number & List<? extends String> >存在<T Number List<+String>>




不存在

<T extends Number & List<? super String> >存在 <T Number List<-String>>




Class<T> 存在 Class<TT> 这个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<-String>




多个&之间使用的时候必须要满足条件




Class<?> 存在<*>




Class<? extends Number> 存在<+ Number> 类型是Number或 Number的子类 跟 使用?当前类泛型的定义没有关系




使用?跟当前类定义的泛型没有关系


get出来的是Number类型

堆空间的对象元素是有泛型的,栈空间指向这个堆空间对象情况下
(使用没有指定泛型类情况下)类定义的泛型<T> 跟实例化出来该类型的对象无关系
在方法上List<T> list = new ArrayList<String>();
在方法上List<T> list = new ArrayList<Integer>();
list 跟 ArrayList<类型>都是同一种类型
但里面的泛型元素就有关系了(没有指定泛型)会出现类型转换错误
在使用限定泛型就会进行泛型检测,会编译不通过
不指定泛型,该对象变量,什么泛型类型的同类型都可以指向,虽然它们里面的泛型不是同一个类型



T类型被标识为Integer类型

但只要涉及Class里面定义的泛型T使用,如果使用的时候T类型不匹配类型就会错误,没有使用就无所谓
返回的元素都是当前类定义的泛型类型
原本Class类定义的是T是Object类型
在别的类定义了一个泛型CurrentClass<T extends Integer> 就是 CurrentClass<T:Integer>
那么使用在CurrentClass这个Class类的时候 Class<T> 就是 Class<T T> 这里的T指代T:Integer 而不是Object了
这个T就是 当前泛型类定义的 T:Integer类型
在CurrentClass操作Class泛型T类型都是当前类定义的T:Integer类型,那么Class类源码定义的泛型都是当中Integer类型使用
使用T泛型类型必须符合Integer相关语法操作,比如不能从String类型转换到Integer类型
<T>默认就是 <T extends Object>


Class里的方法返回的T类型编译器就当做是Integer

这个T就是Integer

<T>在方法泛型上会进行泛型检查,没有类泛型


当方法定义为泛型,类也定义为泛型,方法里面的<T>,方法内部T<T>是使用方法泛型的T
此时必须在main方法指定泛型才会进行泛型检查,类使用的泛型检测类的,方法使用的泛型检测方法的泛型的
当类没有定义泛型的时候,直接使用方法泛型里使用<T>直接检查,不管有没有指定泛型都是有泛型约束
当类定义泛型的时候,方法也定义泛型,在main方法不使用类泛型,方法泛型也不会进行泛型检查,
不会进行泛型检查,但是方法内部都是方法定义的泛型类型。
因为方法泛型检查是按照类的实例来的,否则方法泛型定义为静态方法泛型



类泛型里面使用方法参数<T>泛型,必须在main方法指定泛型才会检查,否则无泛型约束
没有方法泛型,有类泛型,方法定义中的T就是使用类的(直接泛型约束),否则就是使用方法泛型的
此图无泛型约束


Test<K Object;V Object>
Set<Test$Test2<Object;Integer>








