本帖最后由 王杰 于 2012-3-23 08:22 编辑
这是一个利用迭代器打印元素的方法,希望能够实现对人类,学生类和工人类的打印:
public static <T> void sop(Collection<T> ts)//这个地方这样定义对吗?
{
for (Iterator<T> it = ts.iterator();it.hasNext() ; )
{
Object t =it.next();
if(!(t instanceof T))
throw new ClassCastException("类型不匹配");
T p =(T)t;//T代表未知类型,当调用sop方法的时候就能确定,对吗?
System.out.println(p.getName()+"....."+p.getAge());//人类中的方法,已经定义了。
}
}
注意:人类,学生类,工人类没有写出。学生类和工人类都继承人类。默认传入的都是人,所以省略了instanceof判断。
这个方法编译是出错的。为什么。
我的猜想是:静态泛型函数访问的方法只能是Object类中定义的方法。因为如果访问自定义的方法。那么就存在安全隐患。因为类型未知。但是却访问了非Object的方法。
以下是我做的验证,结果却与我的猜想不同:- package day15;
- class Demo
- {
- public void show()
- {
- System.out.println("Demo show()...run!");
- }
- }
- class Test<T>
- {
- public void method1(T t)
- {
- if(!(t instanceof Demo))
- throw new RuntimeException("类型转换异常");
- Demo d = (Demo)t;
- d.show();
- }
- public static <M> void method2(M m)
- {
- if(!(m instanceof Demo))
- throw new RuntimeException("类型转换异常");
- Demo d = (Demo)m;
- d.show();
- System.out.println("method2 .... run ");
-
- }
- }
- class DemoTest
- {
- public static void main(String[] args)
- {
- Test<Demo> td = new Test<Demo>();
- td.method1(new Demo());
- Test.method2(new Demo());
- }
- }
- //运行结果:
- //Demo show()...run!
- //Demo show()...run!
- //method2 .... run
复制代码
以下是完整代码:- package day15;
- import java.util.*;
- public class TreeSetTest
- {
- public static void main(String[] args)
- {
- TreeSet<Student> ts = new TreeSet<Student>(new MyCom());
- ts.add(new Student("nihao03",16));
- ts.add(new Student("nihao01",12));
- ts.add(new Student("nihao02",18));
- sop(ts);
-
- TreeSet<Worker> ts1 = new TreeSet<Worker>(new MyCom());
- ts1.add(new Worker("wnihao03--",16));
- ts1.add(new Worker("wnihao01--",12));
- ts1.add(new Worker("wnihao02--",18));
- sop(ts1);
- }
- // public static void sop(Collection<? extends Person> ts)
- // {
- // for (Iterator<? extends Person> it = ts.iterator();it.hasNext() ; )
- // {
- // Person p = it.next();
- // System.out.println(p.getName()+"....."+p.getAge());
- // }
- // }
- //
- public static <T> void sop(TreeSet<T> ts)
- {
- for (Iterator<T> it = ts.iterator();it.hasNext() ; )
- {
- T p =(T)it.next();
- System.out.println(p.getName()+"....."+p.getAge());
- }
- }
- }
- class Person //implements Comparable//实现Comparable接口,复写compareTo方法。
- {
- private String name;
- private int age;
- Person(String name,int age)
- {
- this.name=name;
- this.age=age;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- return name;
- }
- public void setAge(int age)
- {
- this.age = age;
- }
- public int getAge()
- {
- return age;
- }
- public int hashCode()
- {
- System.out.println(name+"..........hashCode");
- return age;
- }
- public boolean equals(Object obj)
- {
- if(!(obj instanceof Person))
- return false;
- Person p = (Person)obj;
- return this.name.equals(p.name) && this.age==p.age;
- }
- // public int compareTo(Object obj)
- // {
- // if(!(obj instanceof Person))
- // throw new RuntimeException("不是Person类");
- // Person p=(Person)obj;
- //
- // int num = new Integer(this.getAge()).compareTo(new Integer(p.getAge()));
- // if(num==0)
- // return new String(this.getName()).compareTo(new String(p.getName()));
- // return num;
- // }
- }
- class Student extends Person
- {
- Student(String name,int age)
- {
- super(name,age);
- }
- }
- class MyCom implements Comparator<Person>
- {
- public int compare(Person p1,Person p2)
- {
- int num = new String(p1.getName()).compareTo(new String(p2.getName()));
- if(num==0)
- return (p1.getAge()-p2.getAge());
- return num;
- }
- }
- class Worker extends Person
- {
- Worker(String name,int age)
- {
- super(name,age);
- }
- }
复制代码 |