如果someClass.class是从anotherClass.class派生的,请检入编译时间?

时间:2012-07-12 02:41:52

标签: java runtime compile-time typechecking

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

3 个答案:

答案 0 :(得分: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对您不起作用,因为您没有实例,只有类。

摘录自Class.isAssignableFrom的Javadoc:

  

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。如果是这样,它返回true;否则返回false。如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回true。否则返回false。

答案 1 :(得分:0)

如果您只有课程,可以在运行时使用Class.isAssignableFrom()进行检查,如果有实例,则可以使用instanceof运算符进行检查。

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

答案 2 :(得分: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)