关于〈? extends Class 〉和〈T extends Class〉的区别

Posted Firm陈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于〈? extends Class 〉和〈T extends Class〉的区别相关的知识,希望对你有一定的参考价值。

通配符

>Java中通配符用?表示。
>在不确定泛型参数的具体类型时,可以使用?代替,
>比如public  void set(List<?> list)
>在调用方法时,参数既可以是List<String>也可以是List<Integer>

边界


<? extends Number>表示上边界限定,泛型参数只能是Number及其子类,一旦实例化其他参数类型则会报错
<? super Number>表示下边界限定,泛型参数只能是Number和它的父类。

除此之外,我们发现其实在使用< T extends Number >也是有效的,也是限定参数类型T只能是Number及其子类。那么他们之间的区别是什么呢?其实也很简单,
T是用于泛型类和泛型方法中的定义,比如

//泛型类
class Demo1<T extends ClassDemo>
	......

//泛型方法
public <T extends ClassDemo> void set(T x) 
	......



?是用于类的声明或者是参数,比如

public class GenericsTest 

	public static void main(String[] args) 
		// TODO Auto-generated method stub
	ArrayList<? extends Number> str ;//在声明类时使用,不清楚泛型的类型,可用?表示,再用具体的类型实例化
	str = new ArrayList<Integer>();
	//str = new ArrayList<Double>();
	
	GenericsTest a = new GenericsTest();
	List<Double> list = new ArrayList<Double>();
	a.set(list);//在调用参数时直接使用具体的实参
	
	public  void set(List<? extends Number> list) //在定义时泛型参数不确定使用?表示
		
	

以上是关于关于〈? extends Class 〉和〈T extends Class〉的区别的主要内容,如果未能解决你的问题,请参考以下文章

Java 泛型 Class<? extends T>

extend 和append

`<T extends E>` 形式的通用约束,其中`E` 是`enum`?

can‘t be used as a mixin because it extends a class other than ‘Object‘.

can‘t be used as a mixin because it extends a class other than ‘Object‘.

浅显理解Java泛型的super和extends