黑马程序员技术交流社区
标题:
泛型有点不明白帮忙看看下面的代码
[打印本页]
作者:
Zhang_qian
时间:
2012-5-21 00:10
标题:
泛型有点不明白帮忙看看下面的代码
import java.util.*;
class GenericDemo1
{
public static void main(String[] args)
{
TreeSet<Student> s=new TreeSet<Student>(new Comp());
s.add(new Student("aaa",23));
s.add(new Student("ccc",24));
s.add(new Student("bbb",25));
Iterator<Student> it=s.iterator();//为什么写成Iterator it=s.iterator();下面的就编译不了啊
//有点不明白请帮忙解释一下,谢谢
while(it.hasNext())
{
//System.out.println(it.next().getName());这一句编译的时候提示找不到getName方法?
//为什么写成System.out.println(it.next());编译就能通过呢?
System.out.println(it.next().getName());
}
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name;
}
}
class Student extends Person
{
Student(String name,int age)
{
super(name,age);
}
}
class Comp implements Comparator<Person>
{
public int compare(Person p1,Person p2)
{
return p1.getName().compareTo(p2.getName());
}
}
作者:
林豪
时间:
2012-5-21 00:40
我都通过了....也能打印出来...
作者:
彩虹
时间:
2012-5-21 00:53
Iterator<Student> it=s.iterator();//为什么写成Iterator it=s.iterator();下面的就编译不了啊
//有点不明白请帮忙解释一下,谢谢
写成Iterator it=s.iterator();这一句运行不了的原因是,包import java.util.Collection;中定义了一个如下的方法,
Iterator<E> iterator()返回在此 collection 的元素上进行迭代的迭代器。关于元素返回的顺序没有任何保证(除非此 collection 是某个能提供保证顺序的类实例)。
你代码里s.iterator();这个方法调用的就是这个类中的这个方法,因为这个方法的返回值是一个迭代器,类型就为<E>,一般赋值语句”=“前后的变量或对象的类型都必须相同才能赋值,否则,只能用强制类型转换,但你有没有强转,后面为<E>型,所以前面当然也要定义一个泛型类型与之对应啊,<Student>不可少。
至于 System.out.println(it.next().getName());这一句没有问题,编译能通过,结果打印出
aaa
bbb
ccc
作者:
秦冲
时间:
2012-5-21 01:06
查看jdk文档 public Iterator<E> iterator() 这个方法看到,如果你不定义泛型,就不能明确知道返回的迭代器里面装的是什么,
这样一来当你对迭代器进行迭代时,调用.next()方法返回的对象无法被编译器识别为一个具体的对象,在这里它就不知道你是
Student类对象,自然getName编译的时候就会提示找不到该方法,next()方法是迭代器中方法,而System.out方法在运行输
出时调用具体类的toString方法,你看到的输出效果就和getName一样了,因为你的toString也是返回的name。
作者:
8161776
时间:
2012-5-21 07:47
本帖最后由 杨尧 于 2012-5-21 07:51 编辑
class GenericDemo1
{
public static void main(String[] args)
{
TreeSet<Student> s=new TreeSet<Student>(new Comp());
s.add(new Student("aaa",23));
s.add(new Student("ccc",24));
s.add(new Student("bbb",25));
Iterator<Student> it=s.iterator();//为什么写成Iterator it=s.iterator();下面的就编译不了啊
//因为你这里如果不加泛型的话他默认的对象是object的,到下面如果用的话你得强转类型
//有点不明白请帮忙解释一下,谢谢
while(it.hasNext())
{
//System.out.println(it.next().getName());这一句编译的时候提示找不到getName方法?
//上面iterator不加泛型的话it.next()获取的对象是Object的,他没有getName()方法
//要想不加泛型也用getName()方法,可以在这里先强转类型 Object obj = it.next(); Student stu = (Student)obj;
//为什么写成System.out.println(it.next());编译就能通过呢?
//还是上面的原因,你直接打印object对象 他会自动调用object的toString()方法,所以没问题
System.out.println(it.next().getName());
}
}
}
复制代码
作者:
niceBoy
时间:
2012-5-21 10:50
//为什么写成Iterator it=s.iterator();下面的就编译不了啊
//System.out.println(it.next().getName());这一句编译的时候提示找不到getName方法?
public Iterator<E> iterator()返回在此 set 中的元素上按升序进行迭代的迭代器。
因为迭代器如果不定义类型,那么返回的是Object,Object中并没有getName方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2