List<?>和List<T>的区别?以及List 和List<Object>的关系
2017-08-22 16:50
429 查看
两种方式实现的效果类似或者相同,一般情况下。如果类型只在方法声明中出现一次,使用通配符会更好一些,更简单。但是这样只能取,不能放入除了null之外的数据。这种情况可以借助于泛型参数解决
当我们定义泛型的时候用
SomeName<T>
泛型也叫参数化类型,意味着我们在使用泛型的时候要给它参数。
当对已经存在的泛型,我们不想给她一个具体的类型做为类型参数,我们可以给她一个不确定的类型作为参数,(前提是这个泛型必须已经定义)
SomeName<?>
我们可以把这个参数类型加以限制
SomeName<? super B>
一个用在定义的时候(不能用?必须给个名字,比如T等,否则定义的代码里怎么用呢?)
一个是在使用的时候。
通俗地说,"T"是定义类或方法时声明的东西,"?"是调用时传入的东西,二者是不同的概念。
当在外面使用一个带泛型T的类或方法时,T应该用一个实际的数据类型替换它,这里的数据类型可以是Integer,String,Boolean,也可以是"?"(wildcard,通配符)。
有两种情况可以传入"?":
1、使用过程中仅用到Object的方法,跟T的具体类型无关,像equals()等等,因为任何一个泛型肯定是Object的子类;
2、使用过程中不依赖于泛型。最典型的是Class<?>,因为Class类的方法大多跟泛型无关
通俗地说,"T"是定义类或方法时声明的东西,"?"是调用时传入的东西,二者是不同的概念。
当在外面使用一个带泛型T的类或方法时,T应该用一个实际的数据类型替换它,这里的数据类型可以是Integer,String,Boolean,也可以是"?"(wildcard,通配符)。
有两种情况可以传入"?":
1、使用过程中仅用到Object的方法,跟T的具体类型无关,像equals()等等,因为任何一个泛型肯定是Object的子类;
2、使用过程中不依赖于泛型。最典型的是Class<?>,因为Class类的方法大多跟泛型无关
是java泛型的两种用法:List<T>是泛型方法,List<?>是限制通配符
List<T>一般有两种用途:
1、定义一个通用的泛型方法。
伪代码:
上面接口的getList方法如果定义成List<?> ,后面就会报错。‘
2、限制方法的参数之间或参数和返回结果之间的关系。
这样可以限制返回结果的类型以及两个参数的类型一致。
List<?>一般就是在泛型起一个限制作用。
伪代码:
抄的就是抄的,主要是害怕自己以后找不到了.知乎原址:https://www.zhihu.com/question/31429113
当我们定义泛型的时候用
SomeName<T>
泛型也叫参数化类型,意味着我们在使用泛型的时候要给它参数。
当对已经存在的泛型,我们不想给她一个具体的类型做为类型参数,我们可以给她一个不确定的类型作为参数,(前提是这个泛型必须已经定义)
SomeName<?>
我们可以把这个参数类型加以限制
SomeName<? super B>
一个用在定义的时候(不能用?必须给个名字,比如T等,否则定义的代码里怎么用呢?)
一个是在使用的时候。
通俗地说,"T"是定义类或方法时声明的东西,"?"是调用时传入的东西,二者是不同的概念。
当在外面使用一个带泛型T的类或方法时,T应该用一个实际的数据类型替换它,这里的数据类型可以是Integer,String,Boolean,也可以是"?"(wildcard,通配符)。
有两种情况可以传入"?":
1、使用过程中仅用到Object的方法,跟T的具体类型无关,像equals()等等,因为任何一个泛型肯定是Object的子类;
2、使用过程中不依赖于泛型。最典型的是Class<?>,因为Class类的方法大多跟泛型无关
通俗地说,"T"是定义类或方法时声明的东西,"?"是调用时传入的东西,二者是不同的概念。
当在外面使用一个带泛型T的类或方法时,T应该用一个实际的数据类型替换它,这里的数据类型可以是Integer,String,Boolean,也可以是"?"(wildcard,通配符)。
有两种情况可以传入"?":
1、使用过程中仅用到Object的方法,跟T的具体类型无关,像equals()等等,因为任何一个泛型肯定是Object的子类;
2、使用过程中不依赖于泛型。最典型的是Class<?>,因为Class类的方法大多跟泛型无关
是java泛型的两种用法:List<T>是泛型方法,List<?>是限制通配符
List<T>一般有两种用途:
1、定义一个通用的泛型方法。
伪代码:
public interface Dao{ List<T> getList(){}; } List<String> getStringList(){ return dao.getList();//dao是一个实现类实例 } List<Integer> getIntList(){ return dao.getList(); }
上面接口的getList方法如果定义成List<?> ,后面就会报错。‘
2、限制方法的参数之间或参数和返回结果之间的关系。
List<T> getList<T param1,T param2>
这样可以限制返回结果的类型以及两个参数的类型一致。
List<?>一般就是在泛型起一个限制作用。
伪代码:
public Class Fruit(){} public Class Apple extends Fruit(){} public void test(? extends Fruit){}; test(new Fruit()); test(new Apple()); test(new String()); //这个就会报错
这样可以现在test方法的参数必须是Fruit或其子类
抄的就是抄的,主要是害怕自己以后找不到了.知乎原址:https://www.zhihu.com/question/31429113
相关文章推荐
- java List<T>和List<Object>的区别
- java对象和字符串互转以及json字符串转List<Object>集合
- List和List<Object>的区别
- Java的List<Object>如何判断元素类别、输入流的回退,以及Autocad中参照块的坐标变换。
- form前台提交List<Object>对象以及后台处理
- hibernate如何返回一个Map对象 以及List<Map<String, Object>>
- IOS (null)以及<null>的区别
- IList<T>和List<T>区别
- Redis存储Object 和 list<object>
- ArrayList list = new ArrayList() 和List<String> list = new ArrayList<String>() 的区别?
- 遍历List<map<>>以及map方法
- 复杂字符串转List<JSONObject>
- List<object>排序 z
- List<ExpendoObject> 对象使用Linq 查询.
- Json转map和List<Map<String,Object>>
- List<Map<String,Object>>和二维数组的转化
- dynamic_cast<const ObjectList&>(msg);
- Class<Object>与Class<?>有何区别呢
- RestTemplate解决返回类型为Object<List<T>>问题
- List<Map<String,Object>>如何使用Java代码遍历以获取String,Object的值