在实用程序接口Types的文档中,编译器必须为JavaSE6或JavaSE7的注释处理器提供一个实例,对于我正在处理的代码片段,有两种方法引起了我的兴趣。我需要检查字段的类型是否是继承自特定抽象类的类型。两种方法似乎是适用的isAssignable
和isSubtype
。但我不知道该用哪种。
我已经检查了上述文档中引用的Java语言规范的那些部分。我理解子类型和赋值转换之间的区别(至少我认为我理解)。除非我错了,java.lang.Short
不会是原始long
的子类型(子类型是在原始文件中定义的,而不是跨类和基元的),但是可以通过拆解和加宽转换来分配它。
final Short s = 0;
final long l = s;
然而,我仍然不确定在我的情况下最好的方法是什么。检查子类型似乎比可分配性更严格和更可取,但是当涉及到类时,感觉好像一个自动暗示另一个。
long version short:
isAssignable
和isSubtype
是否等价,当比较的typemirror都用于类(而不是接口或枚举)时? 最佳答案
如果我们采用引用赋值,在这种情况下唯一适用的转换是加宽引用转换(当然,身份转换除外)。现在我们有以下执行规则:
扩展引用转换从任何类型S存在到任何类型T,提供S
是T的一个亚型(§4.10)。
这意味着,如果只考虑类,那么讨论子类型或可分配性并不重要。是的,在这种情况下,上述方法是等价的。