您的位置:首页 > 移动开发 > Objective-C

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、定义一个通用的泛型方法。

伪代码:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: