我一直在环顾四周,尽管我出于某种原因找到了一些答案,但我似乎无法理解这个概念,这显然导致了我的代码中的问题。
我有这个:
public static Contact createContact() {
Contact contact = null;
if (ContactUI.getRdb_acquaintance().isSelected()) {
contact = new Acquaintance();
} else if (ContactUI.getRdb_friend().isSelected()) {
contact = new Friend();
//contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText());
} else {
contact = new Family();
//contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText());
//contact.setStr_BDay(ContactUI.getTxt_BDay().getText());
}
setCommonDetails(contact);
return contact;
}
我想要的是,一旦我将联系人初始化为其子类之一,就能够调用子类特定方法 .setStr_telMobile
和 .setStr_BDay
,但我得到错误,我无法访问这些方法。我已对代码中的行进行了注释。
例如,我认为我应该能够将 Contact 类型的对象初始化为 Friend(Contact 的子类),并访问该子类的专用方法和属性。
最佳答案
无论其运行时类型如何,contact
都是 Contact
类型的引用。因此,编译器将只允许您使用 Contact
的方法。
解决此问题的优雅方法可能是使用临时 Friend
引用来初始化您需要的所有成员,然后将其分配给 Contact
:
// Snipped
} else if (ContactUI.getRdb_friend().isSelected()) {
Friend temp = new Friend();
temp.setStr_telMobile(ContactUI.getTxt_telMobile().getText());
contact = temp;
}
// snipped
或者,由于您知道已为 contact
分配了 Friend
实例,因此您可以将其显式向下转换为 Friend
以访问其方法:
// Snipped
} else if (ContactUI.getRdb_friend().isSelected()) {
contact = new Friend();
((Friend) contact).setStr_telMobile(ContactUI.getTxt_telMobile().getText());
}
// snipped
关于java - 多态性,我的程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32209682/