这似乎是一个新手问题,在Java中,如果someClass.class是从anotherClass.class派生的,或者如果在编译时不可能在运行时,如何在编译时检查?
答案 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)