3 回答
TA贡献1820条经验 获得超9个赞
这里 :
protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2){
AbstractObj delta = ...?
}
您可以获得o1with的具体类o1.getClass()。然后,如果这个具体类有一个默认构造函数,你可以调用它Class.newInstance():
protected AbstractObj computeDiff(AbstractObj o1, AbstractObj o2) throws IllegalAccessException, InstantiationException{
AbstractObj delta = o1.getClass().newInstance();
}
TA贡献1836条经验 获得超13个赞
您可以使用 instanceof 语句。您可以将 o1 转换为 ConcreteObj 并使用此类的方法或字段。
if(o1 instanceof ConcreteObj){
//((ConcreteObj)o1).someMethod();
}
TA贡献1780条经验 获得超1个赞
这绝对是代码气味。不要使用 instanceof。不要使用反射。
绝对不要继续走这条路。
您的所有AbstractObj
实例都实现了一组通用操作。由于您computeDiff
对 AbstractObjs 进行操作,因此它不能依赖于它接收的不同实现的任何特殊功能。
因此,方法接收或返回什么类型的对象并不重要,只要它们都遵守 AbstractObj 定义。如果需要,您可以返回一个扩展 AbstractObj 的匿名类或任何其他子类。您甚至可以为此目的创建一个特定的子类。但是无论你返回什么,它都不能返回比 AbstractObj 更多的东西。
将参数和返回值声明为AbstractObj
与调用您方法的人签署的合同。不要破坏你的合同。
添加回答
举报