如何找到方法返回的实例? Java的编程

时间:2011-01-24 07:58:51

标签: java inheritance casting polymorphism instanceof

如果我有以下对象:

Teacher extends Person
Student extends Person

然后,我在一个返回人员列表/数组等的服务中有一个函数,但列表中的某些项目可能是教师,有些可能是学生。

在返回端,我希望用户能够检查每个元素的实例,以确定它是学生还是教师。

构建此代码的最佳方法是什么。

所以,在服务中我想要这样的东西:

public LinkedList<Person> getPersonByID(List<String id>);

5 个答案:

答案 0 :(得分:2)

最好的方法是使用多态来消除显式检查Person类型的需要。你究竟是如何做到的,取决于你的任务,也许你可以提供更多的代码。

答案 1 :(得分:2)

这可以使用visitor pattern 解决 instanceof。 (如果使用普通的多态技术无法解决问题,那么从instanceof should be avoided开始,这种方法可能更受欢迎。)

以下是我的回答over heredemo on ideone.com

的改编
import java.util.*;

public class Test {

    public static void main(String[] args) {

        List<Person> somePersons = new LinkedList<Person>();

        somePersons.add(new Teacher());
        somePersons.add(new Student());
        somePersons.add(new Teacher());

        for (Person p : somePersons)
            p.visit(new Visitor() {
                @Override
                public void accept(Student student) {
                    student.learn("stuff");
                }

                @Override
                public void accept(Teacher teacher) {
                    teacher.teach("some other stuff");
                }
            });
    }
}


interface Visitor {
    public void accept(Teacher a);
    public void accept(Student b);
}

abstract class Person {
    String name;
    abstract void visit(Visitor v);
}

class Teacher extends Person {

    public void teach(String toTeach) {
        System.out.println("I'm teaching " + toTeach);
    }

    public void visit(Visitor sv) {
        sv.accept(this);
    }
}

class Student extends Person {

    public void learn(String toLearn) {
        System.out.println("I'm learning " + toLearn);
    }

    public void visit(Visitor sv) {
        sv.accept(this);
    }
}

答案 2 :(得分:0)

Java中有一个instanceof关键字,可以在运行时用于检查对象的类型。所以,代码如下所示:

LinkedList<Person> foo = getPersonByID(some_id_list);
for (Person p: foo)
   if (p instanceof Teacher)
      // do stuff
   else if (p instanceof Student)
      // again
   else
      // ...

答案 3 :(得分:0)

如果您知道以后需要更多灵活性,可以考虑从 is-a 转变为 has-a 关系。

has -a 是一组人员可以拥有的角色,如教师角色或学生角色。或两者兼而有之,就像学生正在讲课一样......

显示此方法的一个简单示例:


public enum Role {TEACHER, STUDENT}

public class Person {

    Set<Role> roles = new HashSet<Role>();

    public Person() {
      // a person does not have roles initially
    }

    public boolean addRole(Role aRole) {
      return roles.add(aRole);
    }

    public boolean hasRole(Role aRole) {
      return roles.contains(aRole);
    }

    // ...
}

public void someMethod(Person person) {

    if (Person.hasRole(Role.TEACHER)) {
      // do teacher stuff
    }

    if (Person.hasRole(Role.STUDENT)) {
      // do student stuff
      // Note: persons may be Teacher AND Student at the same time
    }

}

答案 4 :(得分:-1)

您始终可以使用以下代码检查给定实例是否为给定类型的类型

        if( selectedPerson instanceof Student)
        ...