600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java泛型中的通配符是_理解在Java泛型中使用通配符?

java泛型中的通配符是_理解在Java泛型中使用通配符?

时间:2023-05-14 07:16:05

相关推荐

java泛型中的通配符是_理解在Java泛型中使用通配符?

我问了一个类似的问题,这是一个更具体的版本,希望能得到明确的答案。

在尝试了解Java通用类型和通配符"?"的用法时,我尝试了以下操作:

List li4 = new ArrayList();

li4.add(new Integer(5));

Integer myInt4 = li4.get(0);

现在,我用更通用的类型替换"

List extends Integer> li = new ArrayList();

Integer myInt = li.get(0);

以上编译良好。

似乎上面的" li"被视为一个列表,其中每个元素都是一个整数(请看li.get(0)调用)。

我还可以执行以下操作:

li = li4;

上面的代码可以正常运行。

但是当我尝试:

li.add(new Integer(5));

我收到以下编译错误(使用Oracle JDeveloper作为IDE):

Error(24,9): cannot find method add(java.lang.Integer)

"? 扩展整数"应该允许任何扩展整数的类型。 它的行为类似于" get"方法,它返回一个整数。 同样,将ArrayList分配给它时也不会抱怨。 因此,例如'li = new ArrayList()'不会编译。 那么,为什么允许我分配另一个ArrayList(),取回一个整数但不添加一个整数?

? extends Integer并不意味着"应该允许任何扩展Integer的类型"。这意味着对于扩展Integer的某些特定T,这是List< T >。

因此,从List extends Integer>中获得的任何内容都会扩展Integer,但是您不能只放入任何内容-我们不知道您放入的类型是否匹配T。

举一个具体的例子,Integer扩展了Number。所以你可以写

List extends Number> list1 = new ArrayList();

List extends Number> list2 = new ArrayList();

但是您不应该写list2.add(new MyNumber())或list2.add(new Integer(3)),因为list2实际上是List。

您提到"针对扩展Integer的某些特定T"。 如果该特定T扩展了Integer,则T必须至少具有在Integer中发现的行为。

是的,但是它可能会有更多的行为。 因此,如果尝试仅将普通的Integer添加到List extends Integer>,则它可能没有应有的所有行为。

以下代码帮助我理解了答案:

List exL = new ArrayList();

exL.add(new Exception());

Exception ex = exL.get(0);

Throwable th = exL.get(0);

exL.add(new NullPointerException());

/** Error(153,7): cannot find method add(java.lang.Exception)

exL.add(new Throwable());

**/

因此,当我们声明List时,元素至少必须具有Exception的行为,这意味着Exception,RuntimeException及其子类。可以将从此类列表返回的元素分配给Exception或其任何子类。"异常e = exL.get(0)"或"可抛出th = exL.get(0)"。也可以将Exception的实例添加或说NullPointerException到List中。

列表genExcepList,可以是List,List或List,因为"?extends Exception"表示Exception及其所有子类。实际上,List是List,List等的超类。对于这些列表类型中的任何一种,从" get"调用返回的元素都保证为Exception类型。因此可以这样做:异常e = genExcepList.get(0)。但是调用genExcepList.add(exception)并不可行,因为List必须满足它允许的每种类型的限制,包括List,List,List等。唯一起作用的是genExcepList.add(null)为'null',适用于每种类型。

另一方面,如果我们有以下内容:

列出rtgs = new ArrayList();

"?super Exception"表示Exception及其任何超类。所以List代表List,List和List。在任何这些列表类型上,都可以调用" add(new Exception());"。因此可以调用rtgs.add(new Exception()),因为Exception也是Throwable and Object。但是,调用" Exception ex = rtgs.get(0)"并不可行,因为从List返回的元素可以是Exception,Throwable和Object中的任何一个。因此,唯一可以安全工作的是"对象ex = rtgs.get(0)"。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。