List<?>和List<T>的区别?以及List 和List<Object>的关系
两种方式实现的效果类似或者相同,一般情况下。如果类型只在方法声明中出现一次,使用通配符会更好一些,更简单。但是这样只能取,不能放入除了null之外的数据。这种情况可以借助于泛型参数解决
当我们定义泛型的时候用
SomeName<T>
泛型也叫参数化类型,意味着我们在使用泛型的时候要给它参数。
当对已经存在的泛型,我们不想给她一个具体的类型做为类型参数,我们可以给她一个不确定的类型作为参数,(前提是这个泛型必须已经定义)
SomeName<?>
我们可以把这个参数类型加以限制
SomeName<? super B>
一个是在使用的时候。
通俗地说,"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