在实用程序接口Types的文档中,其中的一个实例必须由编译器提供给Java SE 6或7的注释处理器,对于我正在编写的代码片段,有两个方法使我感兴趣。我需要检查字段的类型是否从特定抽象类继承的类型。似乎适用的两种方法是isAssignable
和isSubtype
。但我不确定该用哪一个。
我已经检查了上面文档中引用的Java语言规范的那些部分。我理解子类型和赋值转换概念之间的区别(至少我认为我这样做)。除非我弄错了,否则java.lang.Short
不会是原语long
的子类型(子类型是在原语之间定义的,但不是跨类和原语定义的),但由于拆箱和扩展转换,它可以这样分配:
final Short s = 0;
final long l = s;
然而,我仍然不确定在我的情况下使用什么是最好的方法。检查子类型似乎比可赋值性更严格、更可取,但当涉及到类时,感觉好像一个自动暗示了另一个。
长版本短:isAssignable
和isSubtype
是等效的比较类型镜像都是类(不是接口或枚举)?
如果对引用赋值,在这种情况下唯一适用的转换是扩展引用转换(当然,恒等转换除外)。现在我们有以下执行规则:
存在从任何类型S到任何类型T的扩展引用转换,只要S是t的子类型(§4.10)。
这意味着如果你只考虑类,无论你谈论子类型还是可赋值性都无关紧要。是的,上面提到的方法在这个例子中是等价的。