本文介绍了&lt ;?有什么区别?扩展对象>和< E扩展对象>?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有什么区别? extends Object> < E extends Object>
什么时候应该使用另一个?

解决方案

以下是我立即想到的一些差异:




  • 类型参数边界可以指定多个边界 - T扩展A& B ,但通配符不能指定多个边界 - ?扩展A& B 无效。

  • 您可以使用通配符的下限 - ?超级A 是有效的,但不是类型参数 - T super A 无效。


  • 在创建泛型类型时不能使用通配符边界。你必须使用类型参数的边界。在一个方法里面,如果你想要传递参数的类型参数之间的关系,那么你必须使用类型参数界限。例如,您想要传递两个具有相同类型参数的参数化类型。你不能用通配符边界来做到这一点。因此,下面的方法声明将采用相同类型参数的两个列表,它扩展了 Number

      public< T extends Number> void merge(List< T> list1,List< T> list2){
    }




为了结束,我将添加一些来自有效Java的项目 - 项目28:使用有界通配符来增加API灵活性:






$ b






What is difference between <? extends Object> and <E extends Object> ?When should one be used over the other?

解决方案

Here are some differences that immediately comes to my mind:

  • Type parameter bounds can specify multiple bounds - T extends A & B, but with wildcard you cannot specify multiple bounds - ? extends A & B is invalid.

  • You can have lower bounds with wildcard - ? super A is valid, but not with the type parameter - T super A is not valid.

  • You cannot use wildcard bounds while creating a generic type. You have to use type parameter bounds.

  • Inside a method, if you want some relation between the type parameters of arguments passed, then you have to use type parameter bounds. For e.g, you want to pass two parameterized type with same type parameter. You can't do this with wildcard bounds. So the following method declaration will take two list of same type parameter, that extends Number.

    public <T extends Number> void merge(List<T> list1, List<T> list2) {
    }
    

To end with, I'll add some points from Effective Java - Item 28: Use bounded wildcards to increase API flexibility:


References:

这篇关于&lt ;?有什么区别?扩展对象&gt;和&lt; E扩展对象&gt;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 12:38