请选择 进入手机版 | 继续访问电脑版

学JAVA网

 找回密码
 立即注册

List<?>和List<T>的区别?以及List 和List<Object>的关系

[复制链接]
发表于 5 天前 |显示全部楼层
作者:YngLouee16
排版:Anderson

     两种方式实现的效果类似或者相同,一般情况下。如果类型只在方法声明中出现一次,使用通配符会更好一些,更简单。但

是这样只能取,不能放入除了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、定义一个通用的泛型方法。
伪代码:
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或其子类
---------------------


您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|学JAVA网

GMT+8, 2018-11-14 18:53 , Processed in 0.133294 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

Copyright © 2015-2018 xuejava网 / 鲁ICP备17054568号-1
回顶部