首先 public static<T> void fun(Info<T> a){
这个方法定义了泛型,如何确定这个方法到底是什么泛型呢? 这就必须在调用方法时传入这个泛型,所以括号里的Info必须有泛型。 不加泛型肯定报错。意思是你Info<String> a 你要传入这个参数,肯定要告诉方法这个泛型是String。 如果你觉得没必要,那么Info这个对象本身就是不确定泛型的,Info你定义了Object Integer String这就等于是不同的参数类型了。。。如果不定义泛型,那就定义可以变参数,那显然不是这个程序的意思。
为了让不同方法可以操作不同类型,而且类型还不确定。
那么可以将泛型定义在方法上。(泛型方法)
根据你的第二个问题,
? extends E: 可以接受E类型或者E的子类型。 上限。
* ? super E: 可以接受E类型或者E的父类型。下限。
当你传入的参数是一个有继承的关系的时候,就可以考虑 public static void fun(Info<? extends T> a){
了,对于你这个程序,我觉得就可以这么写。因为你泛型都是Object的子类。 但是如果Info泛型是int 或者其他基本类型,就只有用上面那个方法了。基本类型貌似没有上限和下限,他们不属于object
|