Java将类型作为参数传递到需要子类型的函数中

Java将类型作为参数传递到需要子类型的函数中,java,generics,subtype,generalization,Java,Generics,Subtype,Generalization,我是Java新手,我尝试制作一些非常简单的Java应用程序。在我的尝试中,我遇到了泛化的问题。我有一个Person对象的列表。人可以是父亲或母亲 然后,我有两个同名的方法,eat(…),但它们的输入参数不同。这些方法不是Person类的一部分。其中一个方法接受母亲作为参数,另一个接受父亲 问题是如何动态地决定在人员列表中调用哪个方法。当我尝试遍历列表并调用o.eat(迭代器)时,它会提示编译器错误,因为迭代器的类型是Person,但我的eat方法需要母亲或父亲作为参数。编译器不知道我对每种类型的

我是Java新手,我尝试制作一些非常简单的Java应用程序。在我的尝试中,我遇到了泛化的问题。我有一个Person对象的列表。人可以是父亲或母亲

然后,我有两个同名的方法,eat(…),但它们的输入参数不同。这些方法不是Person类的一部分。其中一个方法接受母亲作为参数,另一个接受父亲

问题是如何动态地决定在人员列表中调用哪个方法。当我尝试遍历列表并调用o.eat(迭代器)时,它会提示编译器错误,因为迭代器的类型是Person,但我的eat方法需要母亲或父亲作为参数。编译器不知道我对每种类型的人都有方法

到目前为止,我已经用if语句解决了我的问题,在该语句中,我通过GetType()方法将类类型与母亲和父亲进行比较,如果相等,我可以将Person转换为适当的类型

代码如下所示:

  if (person.getClass().equals(Father.class)) {
            theView.eat((Father) person);
        }


  if (person.getClass().equals(Mother.class)) {
            theView.eat((Mother) person);
        }
Eat方法如下所示:

 public void eat(Mother m){
    textArea.append(m.breakfast);
    textArea.append(m.lunch);
    textArea.append(m.dinner);
 }
午餐、晚餐和早餐只是指示某人正在做什么的字符串

person是通过person对象列表进行迭代的代码

有没有更好的解决方案可以自动化这一过程

提前使用Thx。

使用多态性:

public interface Person{
    void eat();
}

public class Mother implements Person{

    @Override
    public void eat()
    {
        //the code inside eat(Mother) goes here
    }

}

public class Father implements Person{

    @Override
    public void eat()
    {
        //the code inside eat(Father) goes here
    }

}
然后,只需调用人员列表中每个对象的eat方法:

for(final Person person: personList){
    person.eat();
}

我想你需要访客模式,因为你在这里说的

问题是如何动态地决定调用哪个方法 人员名单

这有助于您决定在运行时动态选择哪个路由

来自维基百科:

双重分派是多重分派的一种特殊形式 将函数调用分派给不同具体对象的机制 函数,具体取决于所涉及的两个对象的运行时类型 电话

然后,我有两个同名eat(…)的方法,但它们的输入参数不同

如果您使用不同的
eat
方法实现的类如下:

public class TheView<T extends Person> {
    public void eat(T t) {
         textArea.append(t.getMeals());
    }
}
public <T> void yourMethod(List<? extends Person> personList) {
    for (Person p : personList) {
         theView.eat(p);
    }
}

如果在你的问题中包含一些代码来演示你的问题,可能会有所帮助。我真的不明白他在这里试图做什么:/谢谢你的回答,问题是eat方法不是Person的成员,而是Person是eat方法的参数。方法eat是负责应用程序视图的对象的成员。但是我如何判断母亲或父亲是否被传递给方法eat(T)?因为我想对父亲和母亲采取不同的行动,
eat()
不需要知道传入的具体类型,除非它是
Person
类型。请参阅上面修改的代码以了解我的意思。但是在这个eat方法中,我想在列表框中添加一些文本。所以我不能在父母的模型计算中这样做:(我知道有点乱,你能发布你的
eat()
方法以便我可以帮助你吗?我只是猜测你在做什么。如果你用
公共枚举餐{早餐、午餐、晚餐;}替换
Person
的所有字段
并相应地更改
getFounds()
方法,代码会更干净一些。
public abstract class Person {
    private String breakfast;
    private String lunch;
    // ... other fields

    public abstract void getMeals();

    public String getBreakfast() { return breakfast; }
    // ... other getters
}

public class Father extends Person {
     @Override
     public void getMeals() {
         // implement Father-specific code here
     }
}

public class Mother extends Person {

     @Override
     public String getMeals() {
        StrngBuilder sb = new StringBuilder() ;

        sb.append(getBreakfast());
        sb.append(getLunch());
        sb.append(getDinner());

        return sb.toString();
    }
}