黑马程序员技术交流社区
标题: 可以把List<String>传递给一个接受List<Object>参数的方法吗? [打印本页]
作者: jiangweibin2573 时间: 2014-8-11 12:52
标题: 可以把List<String>传递给一个接受List<Object>参数的方法吗?
本帖最后由 jiangweibin2573 于 2014-8-11 13:30 编辑
如果一个方法定义接受的参数是List<Object>;我可以把List<String>传给该方法吗?为什么!
就想下面这样
- import java.util.*;
- public class Test {
- public static void main(String[] args) {
- List<String> str = new ArrayList<>();
- printList(str);
- }
- public static void printList(List<Object> str) {
- Iterator it = str.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- }
- }
复制代码
作者: ﹑淼 时间: 2014-8-11 13:00
可以啊,所有类都继承Object。传递后相当于多态了。
作者: fantacyleo 时间: 2014-8-11 13:03
不行吧,你让一个能管大学生中学生小学生的老师(List<Object>)去管一个能管中学生的老师(List<String>),合适吗?
作者: justin1258 时间: 2014-8-11 13:04
不行不行..
作者: jiangweibin2573 时间: 2014-8-11 13:11
但是,我这个问题,按你的比方来说,我这么描述:将一个中学老师交给一个可以管大、中、小学老师的机构,不可以吗
作者: fantacyleo 时间: 2014-8-11 13:16
当然不可以。如果你认为List<String>是中学老师,那么List就是老师,你又怎么能把List<Object>的List解读为机构呢?
作者: jiangweibin2573 时间: 2014-8-11 13:26
String是一个对象,Object可以接受任意类型对象。
这个问题中,我是把List<String>当参数去传给一个方法,不知道具体为啥不行。
List<String>是实际参数,List<Object>是形式参数,形参可以接受的范围不是已经包括了实参范围吗?
作者: es2379649 时间: 2014-8-11 13:39
泛型中写什么就是什么吧,不考虑继承
作者: icris 时间: 2014-8-11 13:44
完整的写法是 List<? extends Object> list
在这里 extends Object 是必然的,可以写作 List<?> list
不要用 str 命名不是字符串的东西…
作者: fantacyleo 时间: 2014-8-11 13:58
。。。又回到我之前打的比方上了。这样吧,再说一个编译通不过的例子:
List<Fruit> fruits = new ArrayList<Apple>();
左边是一个装水果的容器,右边是一个装苹果的容器。你可以用装水果的容器装苹果,但用装水果的容器去装一个装苹果的容器就不合适了吧?
作者: liubea 时间: 2014-8-11 14:31
没试过,不过根据多态应该可以,楼主可以试试
作者: ❤如止水之絕境 时间: 2014-8-11 20:58
是不可以的.list是泛型,也就是传入的这个类,是告诉人家有这么一个类型 。是不会考虑继承关系的
作者: rolling-stone 时间: 2014-8-11 22:39
很简单,String是一个对象的基本类型,而Object是所有类的父类,这是两个不相关的概念.
作者: a6511631 时间: 2014-8-12 08:43
无耻的借用一下张老师的PPT:使用泛型的注意事项:
参数化类型可以引用一个原始类型的对象,编译报告警告,例如,
Collection<String> c = new Vector();//可不可以,不就是编译器一句话的事吗?
原始类型可以引用一个参数化类型的对象,编译报告警告,例如,
Collection c = new Vector<String>();//原来的方法接受一个集合参数,新的类型也要能传进去
参数化类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Object>(); //错误!///不写<Object>没错,写了就是明知故犯
Vector<Object> v = new Vector<String>(); //也错误!
编译器不允许创建泛型变量的数组。即在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面语句有错误:
Vector<Integer> vectorList[] = new Vector<Integer>[10];
泛型中的类型参数严格说明集合中装载的数据类型是什么和可以加入什么类型的数据,注意:Collection<String>和Collection<Object>是两个没有转换关系的参数化的类型。
假设Vector<String> v = new Vector<Object>();可以的话,那么以后从v中取出的对象当作String用,而v实际指向的对象中可以加入任意的类型对象;假设Vector<Object> v = new Vector<String>();可以的话,那么以后可以向v中加入任意的类型对象,而v实际指向的集合中只能装String类型的对象。肯定会报错了
作者: 阿磊 时间: 2014-8-12 09:00
是不行的,高新里面有说到泛型,这么做是明知故犯,编译不通过的
作者: 晓风 时间: 2014-8-12 09:40
不可以,因为形参List<Object>声明的是什么类型都可以装,而List<String>只能装String类型的。泛型中不存在继承关系。当你把List<String>作为实参传入形参为List<Object>的时候,就相当于是:List<Object> str = new List<String>(),这两个集合类型想让是不一样的。
作者: 怀念黑海岸 时间: 2014-8-12 10:12
貌似有点那么一点感觉,我看到这个就想起了转型,你传入一个很大范围的类型对象到接收一个很小范围的类型变量的方法中去肯定也要进行强转的啊,个人觉得不行。。。
作者: ZhangYL 时间: 2014-8-12 16:14
等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容);
ArrayList<String> al = new ArrayList<Object>(); //错
//要保证左右两边的泛型具体类型一致就可以了,这样不容易出错。
ArrayList<? extends Object> al = new ArrayList<String>();
上面这种是可以的,但是不能进行添加,因为仍然不清楚引用的类型到底是什么
al.add("aa"); //错
就相当于你只知道老虎在动物园里,但是却不知道把老虎添加到哪个笼子里一样。
作者: Caincxy 时间: 2014-8-12 16:28
学习来的.......
作者: jiangweibin2573 时间: 2014-8-12 16:41
他只是这么说的,没怎么透彻
作者: 深寒丶 时间: 2015-11-11 18:17
Object是所有类的父类在泛型里面并不实用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |