1

这似乎是一个新手问题,在 Java 中,我如何在编译时检查 someClass.class 是否派生自 anotherClass.class 或在运行时是否在编译时是不可能的?

4

3 回答 3

3

在代码中:

anotherClass.class.isAssignableFrom( someClass.class );

如果您还想检查另一个类是否是真正的类(而不是接口),请添加对isInterface()

!anotherClass.class.isInterface() && anotherClass.class.isAssignableFrom( someClass.class );

例子:

System.out.println( Number.class.isAssignableFrom( Integer.class )); // true

请注意,这instanceof对您不起作用,因为您没有实例,只有类。

Javadoc 的摘录Class.isAssignableFrom

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。如果此 Class 对象表示原始类型,则如果指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回false。

于 2012-07-12T02:47:42.900 回答
0

您可以在运行时检查Class.isAssignableFrom()您是否只有类,或者instanceof如果您有实例,则检查运算符。

至于编译时间,我不明白这个问题。为什么编写代码的人在编译之前不知道呢?

于 2012-07-12T02:49:07.240 回答
0

正如其他人已经建议的那样,签入运行时很简单。但是,可以通过一些小技巧在编译时完成。

您可以使用泛型来拥有这样的方法:

public static <A, B extends A> void isExtends(Class<A> clazzA, Class<B> clazzB) {
    // empty
}

如果您想确保 someClass.class 是从 anotherClass.class 派生的,只需输入您的代码:

isExtends(AnotherClass.class, SomeClass.class);

编译器将帮助您验证 SomeClass 是否从 AnotherClass 扩展而来。

(但老实说,我想知道这在现实生活中是否真的有用:P)

于 2012-07-12T03:45:33.943 回答