我有一个函数,它首先检查传递参数的类型:
public void myFunc(Object myObj){
if(myObj instanceof Student){
Student p = (Student) myObj;
}else{
Teacher p = (Teacher) myObj;
}
//after above check I want to handle p in a generic way
//of course the following p is not resolved...
p.getName();
p.registerSelf();
}
p
始终需要先进行强制转换。如何让编译器首先知道 p 的类型,然后调用 Teacher
和 Student
都有的公共(public)函数。
My Person 和 Teacher 是使用 apache avro 自动生成的。我无法定义两个类(Person 和 Student)来扩展同一个类。
最佳答案
让学生和教师从共同的父级延伸 - 比如说人。 将 getName 和 registerSelf 方法放入 Person 中。然后无条件地向 Person 键入 case 并调用您放入 Person 中的常用方法。
好的,“我的 Person 和 Teacher 是使用 apache avro 自动生成的。我无法定义这两个类(Person 和 Student)来扩展同一个类。”
我认为这部分不在最初的问题中。
根据新信息,我会说:
1)我在我的一个项目中生成的类也有类似的问题。我认为没有一个很好的解决方案,除非您以某种方式强制学生和教师在生成这些类后实现一些通用接口(interface)(并且无需手动更改生成的类/我猜您会想要该要求,因为您可能会保留它们在某些版本控制系统中/)。我建议您发布一个新问题,因为重要的声明不是其初始版本的一部分。
2) 您还可能想查看 http://en.wikipedia.org/wiki/Decorator_pattern不确定它是否适用于您的情况,但您检查一下,也许是。
3)您可以使用反射,如 grexter89 指出的那样。这可能是最适合您的情况。
关于java - 以通用方式处理不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20610048/