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