A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 jiangweibin2573 于 2014-8-11 13:30 编辑

如果一个方法定义接受的参数是List<Object>;我可以把List<String>传给该方法吗?为什么!
就想下面这样
  1. import java.util.*;

  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 List<String> str = new ArrayList<>();
  5.                 printList(str);
  6.         }

  7.         public static void printList(List<Object> str) {
  8.                 Iterator it = str.iterator();
  9.                 while(it.hasNext()){
  10.                         System.out.println(it.next());
  11.                 }
  12.         }
  13. }
复制代码

20 个回复

倒序浏览
可以啊,所有类都继承Object。传递后相当于多态了。
回复 使用道具 举报
不行吧,你让一个能管大学生中学生小学生的老师(List<Object>)去管一个能管中学生的老师(List<String>),合适吗?
回复 使用道具 举报
不行不行..
回复 使用道具 举报
fantacyleo 发表于 2014-8-11 13:03
不行吧,你让一个能管大学生中学生小学生的老师(List)去管一个能管中学生的老师(List),合适吗? ...

但是,我这个问题,按你的比方来说,我这么描述:将一个中学老师交给一个可以管大、中、小学老师的机构,不可以吗
回复 使用道具 举报
jiangweibin2573 发表于 2014-8-11 13:11
但是,我这个问题,按你的比方来说,我这么描述:将一个中学老师交给一个可以管大、中、小学老师的机构, ...

当然不可以。如果你认为List<String>是中学老师,那么List就是老师,你又怎么能把List<Object>的List解读为机构呢?
回复 使用道具 举报
fantacyleo 发表于 2014-8-11 13:16
当然不可以。如果你认为List是中学老师,那么List就是老师,你又怎么能把List的List解读为机构呢? ...

String是一个对象,Object可以接受任意类型对象。
这个问题中,我是把List<String>当参数去传给一个方法,不知道具体为啥不行。
List<String>是实际参数,List<Object>是形式参数,形参可以接受的范围不是已经包括了实参范围吗?
回复 使用道具 举报
es2379649 来自手机 中级黑马 2014-8-11 13:39:07
8#
泛型中写什么就是什么吧,不考虑继承
回复 使用道具 举报
icris 中级黑马 2014-8-11 13:44:35
9#
完整的写法是 List<? extends Object> list
在这里 extends Object 是必然的,可以写作 List<?> list
不要用 str 命名不是字符串的东西…
回复 使用道具 举报
jiangweibin2573 发表于 2014-8-11 13:26
String是一个对象,Object可以接受任意类型对象。
这个问题中,我是把List当参数去传给一个方法,不知道 ...

。。。又回到我之前打的比方上了。这样吧,再说一个编译通不过的例子:
List<Fruit> fruits =  new ArrayList<Apple>();

左边是一个装水果的容器,右边是一个装苹果的容器。你可以用装水果的容器装苹果,但用装水果的容器去装一个装苹果的容器就不合适了吧?
回复 使用道具 举报
没试过,不过根据多态应该可以,楼主可以试试
回复 使用道具 举报
是不可以的.list是泛型,也就是传入的这个类,是告诉人家有这么一个类型 。是不会考虑继承关系的
回复 使用道具 举报
很简单,String是一个对象的基本类型,而Object是所有类的父类,这是两个不相关的概念.
回复 使用道具 举报
无耻的借用一下张老师的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类型的对象。肯定会报错了



回复 使用道具 举报
是不行的,高新里面有说到泛型,这么做是明知故犯,编译不通过的
回复 使用道具 举报
不可以,因为形参List<Object>声明的是什么类型都可以装,而List<String>只能装String类型的。泛型中不存在继承关系。当你把List<String>作为实参传入形参为List<Object>的时候,就相当于是:List<Object> str = new List<String>(),这两个集合类型想让是不一样的。
回复 使用道具 举报
貌似有点那么一点感觉,我看到这个就想起了转型,你传入一个很大范围的类型对象到接收一个很小范围的类型变量的方法中去肯定也要进行强转的啊,个人觉得不行。。。
回复 使用道具 举报
等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容);
ArrayList<String> al = new ArrayList<Object>();  //错
//要保证左右两边的泛型具体类型一致就可以了,这样不容易出错。
ArrayList<? extends Object> al = new ArrayList<String>();
上面这种是可以的,但是不能进行添加,因为仍然不清楚引用的类型到底是什么
al.add("aa");  //错
就相当于你只知道老虎在动物园里,但是却不知道把老虎添加到哪个笼子里一样。
回复 使用道具 举报
学习来的.......
回复 使用道具 举报
a6511631 发表于 2014-8-12 08:43
无耻的借用一下张老师的PPT:使用泛型的注意事项:
          参数化类型可以引用一个原始类型的对象,编译 ...

他只是这么说的,没怎么透彻
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马