黑马程序员技术交流社区
标题:
毕老师视频中的小问题
[打印本页]
作者:
izwj
时间:
2012-3-25 16:57
标题:
毕老师视频中的小问题
import java.util.*;
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
String getName()
{
return name;
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
class GenericDemo5
{
public static void main(String[] args)
{
ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
print(al);
ArrayList<Worker> al2=new ArrayList<Worker>();
al2.add(new Worker("abc...1"));
al2.add(new Worker("abc...2"));
al2.add(new Worker("abc...3"));
print(al2);
}
static void print(ArrayList<? extends Person>al)//改成<? super Worker>al 怎么不行啊???
{
Iterator<? extends Person> it=al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
}
作者:
田斌
时间:
2012-3-25 17:01
extends继承,super()方法调用父类方法,你这? super Worker还真看不懂
作者:
万正
时间:
2012-3-25 17:02
应该可以改成<? super Worker>,你把错误发上来看看~
作者:
izwj
时间:
2012-3-25 17:10
黑马程序员_毕向东_Java基础视频教程第15天-12-集合框架(泛型限定).avi http://dl.dbank.com/c0u1xih8z8,中的例子,老师没演示出来,我试了试用super代替extends没成功,不知道怎么回事,应该可以的。
作者:
丰亚彬
时间:
2012-3-25 17:22
你的代码是可以运行的,没有问题,你仔细看看jvm给你的错误提示
作者:
izwj
时间:
2012-3-25 17:28
本帖最后由 izwj 于 2012-3-25 17:30 编辑
就是改成这样。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
import java.util.*;
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
String getName()
{
return name;
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
class GenericDemo5
{
public static void main(String[] args)
{
ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
print(al);
ArrayList<Worker> al2=new ArrayList<Worker>();
al2.add(new Worker("abc...1"));
al2.add(new Worker("abc...2"));
al2.add(new Worker("abc...3"));
print(al2);
}
/*static void print(ArrayList<? extends Person>al)
{
Iterator<? extends Person> it=al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}*/
static void print(ArrayList<? super Worker>al)
{
Iterator<? super Worker> it=al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
}
为啥不行呢????????????????????????????????????
作者:
izwj
时间:
2012-3-25 17:29
为啥不行呢
作者:
adison
时间:
2012-3-25 19:02
对于这个问题,我是这样理解的,因为泛型限定 ? super T:可以接收T类型或者T的父类型,那就是说可以接受Object类,而
Iterator<? super Worker> it=al.iterator();
这个语句中的<? super Worker> 因为仅仅知道要操作Worker类或其父类,所以为了不出错,会自动将接收的元素变成Object类型,那么因为Object类中没有getName()方法,所以编译失败,要代码可以运行,就需要将类型强转一下
import java.util.*;
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
String getName()
{
return name;
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
class GenericDemo5
{
public static void main(String[] args)
{
ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
print(al);
ArrayList<Worker> al2=new ArrayList<Worker>();
al2.add(new Worker("abc...1"));
al2.add(new Worker("abc...2"));
al2.add(new Worker("abc...3"));
print(al2);
}
static void print(ArrayList
<? super Worker
>al)
{
Iterator
<? super Worker
> it=al.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getName());
}
}
}
作者:
izwj
时间:
2012-3-25 19:21
adison 发表于 2012-3-25 19:02
对于这个问题,我是这样理解的,因为泛型限定 ? super T:可以接收T类型或者T的父类型,那就是说可以接受O ...
非常感谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2