Java将类型作为参数传递到需要子类型的函数中
我是Java新手,我尝试制作一些非常简单的Java应用程序。在我的尝试中,我遇到了泛化的问题。我有一个Person对象的列表。人可以是父亲或母亲 然后,我有两个同名的方法,eat(…),但它们的输入参数不同。这些方法不是Person类的一部分。其中一个方法接受母亲作为参数,另一个接受父亲 问题是如何动态地决定在人员列表中调用哪个方法。当我尝试遍历列表并调用o.eat(迭代器)时,它会提示编译器错误,因为迭代器的类型是Person,但我的eat方法需要母亲或父亲作为参数。编译器不知道我对每种类型的人都有方法 到目前为止,我已经用if语句解决了我的问题,在该语句中,我通过GetType()方法将类类型与母亲和父亲进行比较,如果相等,我可以将Person转换为适当的类型 代码如下所示:Java将类型作为参数传递到需要子类型的函数中,java,generics,subtype,generalization,Java,Generics,Subtype,Generalization,我是Java新手,我尝试制作一些非常简单的Java应用程序。在我的尝试中,我遇到了泛化的问题。我有一个Person对象的列表。人可以是父亲或母亲 然后,我有两个同名的方法,eat(…),但它们的输入参数不同。这些方法不是Person类的一部分。其中一个方法接受母亲作为参数,另一个接受父亲 问题是如何动态地决定在人员列表中调用哪个方法。当我尝试遍历列表并调用o.eat(迭代器)时,它会提示编译器错误,因为迭代器的类型是Person,但我的eat方法需要母亲或父亲作为参数。编译器不知道我对每种类型的
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();
}
}