2010-11-04 108 views
24

在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()请问我需要什么?

回答

48

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)) { 
     // ... 
    } 
} 
+0

这是迄今为止最好的解决方案,但我会补充说,尝试这样做有点“代码味道”。正如马丁布罗德赫斯特所说,你可能想要找到一个更好的方法去做。 – 2010-11-04 20:08:35

+0

@Justin:我也意识到这一点。不幸的是,参数是'Class',并且需求指出'A.class'本身不应该通过检查。最好的做法是使'A'抽象并应用策略模式,但这需要'A'的具体*实例作为参数,而不是'Class '。我不确定这将如何影响OP设计的剩余部分。也许OP有自己的理由选择'Class'作为参数。在我们提供更好的设计建议之前,功能需求必须更加明确。 – BalusC 2010-11-04 20:17:53

+0

这是用于实际的商业系统还是学校项目? – 2010-11-05 20:36:37

5

是的,Class.getSuperclass()正是你所需要的。

Class<?> c = obj.getClass(); 
System.out.println(c.getSuperclass() == Some.class); 
+0

你想==或等于(或者它对类对象无关紧要)吗? – 2010-11-04 19:12:52

+2

并且对于E类,我将不得不迭代树? – 2010-11-04 19:12:54

+2

@sprocketonline - 是的。 – Jeremy 2010-11-04 19:15:14

8

你应该尽量避免类型检查,而不是实现B,C和E是你想要做什么,有A和d版本做什么函数,然后调用该函数从DoSomething的类中。

如果你做类型检查它不是很好维护,因为当你添加新的类时,你需要改变条件逻辑。

这就是类和重写的问题。

0

如果你想编译时检查,你可以使用泛型(Java 5中及以上):

public void myFunc(Class<? extends A> cls) { 
} 

以不从继承的任何类传递生成编译时错误。

相关问题