class.isAssignableFrom()当不是相同的包时发送false

我使用isAssignableFrom()类方法来确定一个来自其他应用程序的类是否实现接口。 因此,我在“应用程序”中有相同的接口,但不在同一个包中。 当两个接口的包不相同时,该方法返回false,否则返回true。

这是一种正常的行为?


当两个接口的包不相同时,该方法返回false,否则返回true。

这是一种正常的行为?

是的 。 包名称是类(和interface )名称的一部分。 当接口处于不同的包中时,它们具有不同的名称(因此不一样)。


这个方法的JavaDoc

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

具体来说,此方法测试指定Class参数表示的类型是否可以通过标识转换或通过扩展参考转换转换为此Class对象表示的类型。

有关详细信息,请参阅Java语言规范,第5.1.1和5.1.4节。

参数:cls - 要检查的Class对象返回:指示类型cls的对象是否可以分配给此类的对象的布尔值

简而言之,只有在class = cls变量可以转换(赋值)给class = class变量的情况下,该方法才会返回true

    Set<Integer> set = new HashSet<>();
    SortedSet<Integer> sortedSet = new TreeSet<>();

    System.out.println(Set.class.isAssignableFrom(SortedSet.class)); // true
    System.out.println(SortedSet.class.isAssignableFrom(Set.class)); // false


    Set<Integer> set2 = sortedSet; // ok
    SortedSet sortedSet2 = set; // compilation error 

所以,这是关于方法本身。

现在谈谈你的情况。 你说:

因此,我在“应用程序”中有相同的接口,但不在同一个包中。

但是在行为上而不是名义上,你有两个不同的界面。 他们可能有相似的名字(但只是相似的,因为封装也是部分或类名),但它们真的是不同的类,并且它们不能被转换。 哦,对不起,如果它们有相同的超类(它们扩展了相同的接口),它们可以互相转换。

您可以通过将SetSortedSet更改为您的界面来进行简单的检查。

链接地址: http://www.djcxy.com/p/57411.html

上一篇: class.isAssignableFrom() send false when not the same package

下一篇: How to find out if a class member is static and a field in Java