class.isAssignableFrom()在不同的包时发送false

时间:2016-02-09 11:30:06

标签: java

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

这是正常行为吗?

2 个答案:

答案 0 :(得分:2)

  

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

     

这是正常行为吗?

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

答案 1 :(得分:0)

此方法的JavaDoc

  

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

     

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

     

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

     

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

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

    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 

所以,它是关于方法本身的。

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

  

因此我在&#34; application&#34;中都有相同的界面。但不在同一个包装中。

但是在契约而不是名义上,你有两个不同的接口。它们可能有相似的名称(但只是类似,因为包也是部分或类名),但它们真的是不同的类,它们不能被强制转换。哦,对不起,如果他们有相同的超类(他们扩展相同的界面),他们可以一个接一个地施放。

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