在java中,〈?extends A 〉与〈T extends A〉有什么区别?
答案:3 悬赏:0 手机版
解决时间 2021-03-27 20:02
- 提问者网友:放下
- 2021-03-27 04:58
在java中,〈?extends A 〉与〈T extends A〉有什么区别?
最佳答案
- 五星知识达人网友:青尢
- 2021-03-27 05:51
这是泛型嘛,泛型简单的意思就是说,你不知道你想要的这个类具体是啥,但是你可以知道这个类的相关子类或者父类
所以从上面的观点来看, extends A> 和是没啥区别的
例如下面这个两个方法表达的意思是一样的,都表示参数是一个集合,这个集合可能包含着A或者A的任何子类
public void someMethod(List extends A> list);
public void someMethod(List list);这是一种情况,但是相比而言,一个类中,多处方法都需要这个泛型的时候,要比 extends A> 方便的多,就像在代码里,你声明了一个变量后,你就可以在这个变量的代码块里任何地方调用,同理就像是声明了一个泛型变量T,这个T是一个A或者A的子类,然后这个变量T在所能用的范围之内,你都可以直接用T表示,不用再写 extends A>或者,比如:
// 前面定义了T,后面参数就可以用T表示了
publicvoid some(List t);上面是方法里,这个范围比较窄,放在类里,效果更明显,比如:
public class B{
// 一个A类或者A子类的变量
private T a;
// 一个方法
public void some(List list);
}所以可以看到,差别也不太大
所以从上面的观点来看, extends A> 和
例如下面这个两个方法表达的意思是一样的,都表示参数是一个集合,这个集合可能包含着A或者A的任何子类
public void someMethod(List extends A> list);
public void someMethod(List
// 前面定义了T,后面参数就可以用T表示了
public
public class B
// 一个A类或者A子类的变量
private T a;
// 一个方法
public void some(List
}所以可以看到,差别也不太大
全部回答
- 1楼网友:掌灯师
- 2021-03-27 07:24
可以说没什么区别
- 2楼网友:十鸦
- 2021-03-27 06:13
经常发现有List< super T>、Set的声明,是什么意思呢?< super T>表示包括T在内的任何T的父类,< extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。
extends
List< extends Number> foo3的通配符声明,意味着以下的赋值是合法的: // Number "extends" Number (in this context) List< extends Number> foo3 = new ArrayList< extends Number>(); // Integer extends Number List< extends Number> foo3 = new ArrayList< extends Integer>(); // Double extends Number List< extends Number> foo3 = new ArrayList< extends Double>();
读取操作通过以上给定的赋值语句,你一定能从foo3列表中读取到的元素的类型是什么呢?你可以读取到Number,因为以上的列表要么包含 Number元素,要么包含Number的类元素。你不能保证读取到Integer,因为foo3可能指向的是List。你 不能保证读取到Double,因为foo3可能指向的是List。
写入操作过以上给定的赋值语句,你能把一个什么类型的元素合法地插入到foo3中呢?你不能插入一个Integer元素,因为foo3可能指向 List。你不能插入一个Double元素,因为foo3可能指向List。你不能插入一个 Number元素,因为foo3可能指向List。你不能往List< extends T>中插入任何类型的对象,因为你不能保证列表实际指向的类型是什么,你并不能保证列表中实际存储什么类型的对象。唯一可以保证的是,你可以从中读 取到T或者T的子类。
super
现在考虑一下List< super T>。
List< super Integer> foo3的通配符声明,意味着以下赋值是合法的: // Integer is a "superclass" of Integer (in this context) List< super Integer> foo3 = new ArrayList(); // Number is a superclass of Integer List< super Integer> foo3 = new ArrayList(); // Object is a superclass of Integer List< super Integer> foo3 = new ArrayList
extends
List< extends Number> foo3的通配符声明,意味着以下的赋值是合法的: // Number "extends" Number (in this context) List< extends Number> foo3 = new ArrayList< extends Number>(); // Integer extends Number List< extends Number> foo3 = new ArrayList< extends Integer>(); // Double extends Number List< extends Number> foo3 = new ArrayList< extends Double>();
读取操作通过以上给定的赋值语句,你一定能从foo3列表中读取到的元素的类型是什么呢?你可以读取到Number,因为以上的列表要么包含 Number元素,要么包含Number的类元素。你不能保证读取到Integer,因为foo3可能指向的是List
写入操作过以上给定的赋值语句,你能把一个什么类型的元素合法地插入到foo3中呢?你不能插入一个Integer元素,因为foo3可能指向 List
super
现在考虑一下List< super T>。
List< super Integer> foo3的通配符声明,意味着以下赋值是合法的: // Integer is a "superclass" of Integer (in this context) List< super Integer> foo3 = new ArrayList
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯