java泛型中<?>和<T>

T 代表一种类型

加在类上==============》class SuperClass<A>{}

加在方法上============》public <T>void fromArrayToCollection(T[] a, Collection<T> c){}

(注)方法上的<T>代表括号里面要用到泛型参数,若类中传了泛型,此处可以不传,调用类型上面的泛型参数,前提是方法中使用的泛型与类中传来的泛型一致。

class People<T>{

public void show(T a) {

   }

}

 

?是通配符,泛指所有类型

一般用于定义一个引用变量,这么做的好处是,定义一个sup的引用变量,就可以指向多个对象。

SuperClass<?> sup = new SuperClass<String>("lisi");

sup = new SuperClass<People>(new People());

sup = new SuperClass<Animal>(new Animal());

 

T和?运用的地方有点不同,?是定义在引用变量上,T是类上或方法上

 

如果有泛型方法和非泛型方法,都满足条件,会执行非泛型方法

public void show(String s){

      System.out.println("1");

   }

 

 @Override

   public void show(T a) {

      System.out.println("2");

   }

 

类型参数“<T>” 声明泛型类或泛型方法。

无界通配符“<?>”使用泛型类或泛型方法

写成T就是将类型固定,而?则不固定

 

 

 

?和 T 的区别

 

 ?和 T 都表示不确定的类型,区别在于我们可以对 T 进行操作,但是对 ?不行

// 可以
T t = operate();

// 不可以
?car = operate();

 

区别1:通过 T 来 确保 泛型参数的一致性

// 通过 T 来 确保 泛型参数的一致性
public <T extends Number> void
test(List<T> dest, List<T> src)

//通配符是 不确定的,所以这个方法不能保证两个 List 具有相同的元素类型
public void
test(List<? extends Number> dest, List<? extends Number> src)

区别2:类型参数可以多重限定而通配符不行

 

 

使用 & 符号设定多重边界(Multi Bounds),指定泛型类型 T 必须是 MultiLimitInterfaceA 和 MultiLimitInterfaceB 的共有子类型,此时变量 t 就具有了所有限定的方法和属性。

区别3:通配符可以使用超类限定而类型参数不行

类型参数 T 只具有 一种 类型限定方式:

T extends A

但是通配符 ? 可以进行 两种限定:

? extends A
? super A
 

 

posted @ 2021-04-13 17:52  KLAPT  阅读(324)  评论(0编辑  收藏  举报