【发布时间】:2021-03-12 22:32:10
【问题描述】:
我有两个Class<? extends SomeClass> 变量,一个通过循环HashMap 的键获得,我们称之为A,另一个作为参数传递,我们称之为B。我想看看B 是否扩展A。
所以,就我目前的理解而言,我会创建一个B 的实例(使用createInstance)并检查instanceof。但这不仅很慢,而且很麻烦,因为类需要一个空的构造函数。
请参阅here 和here,他们在其中讨论isAssignableFrom 和getSuperClass,但isAssignableFrom(从我在那里读到的内容)不适用于同一类(SomeClass.isAssignableFrom(SomeClass) ?),并且getSuperClass 不会上树。
有没有一种方法可以检查B 是否扩展A 而无需创建B 的实例?
例如:
class SomeClass {}
class ExtendingClassA extends SomeClass {}
class ExtendingClassAB extends ExtendingClassA {}
class ExtendingClassB extends SomeClass {}
boolean ClassExtendsClass(Class<? extends SomeClass> A,Class<? extends SomeClass> B) {
return A.class instanceof B.class;
}
ClassExtendsClass(SomeClass.class, ExtendingClassA.class); //true
ClassExtendsClass(SomeClass.class, ExtendingClassAB.class); //true
ClassExtendsClass(SomeClass.class, ExtendingClassB.class); //true
ClassExtendsClass(ExtendingClassA.class, ExtendingClassB.class); //false
【问题讨论】:
-
我没有看到您描述的问题。如果
B extends A,则A.class.isAssignableFrom(B.class)将是true。相反,B.class.isAssignableFrom(A.class)将是false应该是,因为B不是A的超类(也不是同一个类)。B.class.isAssignableFrom(B.class)也将是true(A相同) -
getSuperClass自己也不会上树,但你可以带着它上树。 -
@Rogue 是的,我想检查
B是否扩展了A,以及B是否是A -
@LouisWasserman 好主意,我会为此使用
while循环吗?喜欢while(c = c.getSuperClass())? -
@Werilous 再次考虑相反的情况。当且仅当(
B extends A或B == A)时A.class.isAssignableFrom(B.class)为真。没有理由不使用#isAssignableFrom,它正是您正在寻找的功能。同样,如果您拥有的是A和B的objects,则完全放弃Class<?>-es,只使用instanceof
标签: java inheritance multiple-inheritance