如何确定一个类是否扩展了Java中的另一个类?
在Java中,我该如何去决定一个类的扩展类?如何确定一个类是否扩展了Java中的另一个类?
public class A{
}
public class B extends A{
}
public class C extends A{
}
public class D{
}
public class E extends B{
}
public class doSomething{
public void myFunc(Class cls){
//need to check that cls is a class which extends A
//i.e. B, C and E but not A or D
}
}
would cls.getSuperClass()
请问我需要什么?
getSuperClass()
方法将因E
失败,因为其直接超类不是A
,而是B
。而是使用Class#isAssignableFrom()
。
public void myFunc(Class cls){
//need to check that cls is a class which extends A
//i.e. B, C and E but not A or D
if (cls != A.class && A.class.isAssignableFrom(cls)) {
// ...
}
}
是的,Class.getSuperclass()
正是你所需要的。
Class<?> c = obj.getClass();
System.out.println(c.getSuperclass() == Some.class);
你想==或等于(或者它对类对象无关紧要)吗? – 2010-11-04 19:12:52
并且对于E类,我将不得不迭代树? – 2010-11-04 19:12:54
@sprocketonline - 是的。 – Jeremy 2010-11-04 19:15:14
你应该尽量避免类型检查,而不是实现B,C和E是你想要做什么,有A和d版本做什么函数,然后调用该函数从DoSomething的类中。
如果你做类型检查它不是很好维护,因为当你添加新的类时,你需要改变条件逻辑。
这就是类和重写的问题。
如果你想编译时检查,你可以使用泛型(Java 5中及以上):
public void myFunc(Class<? extends A> cls) {
}
以不从继承的任何类传递生成编译时错误。
这是迄今为止最好的解决方案,但我会补充说,尝试这样做有点“代码味道”。正如马丁布罗德赫斯特所说,你可能想要找到一个更好的方法去做。 – 2010-11-04 20:08:35
@Justin:我也意识到这一点。不幸的是,参数是'Class',并且需求指出'A.class'本身不应该通过检查。最好的做法是使'A'抽象并应用策略模式,但这需要'A'的具体*实例作为参数,而不是'Class '。我不确定这将如何影响OP设计的剩余部分。也许OP有自己的理由选择'Class'作为参数。在我们提供更好的设计建议之前,功能需求必须更加明确。 – BalusC 2010-11-04 20:17:53
这是用于实际的商业系统还是学校项目? – 2010-11-05 20:36:37