TypeMirror的isSubtype和isAssignable之间的区别

时间:2011-10-13 15:26:43

标签: java mirror annotation-processing subtype reflection

在实用程序接口Types的文档中,编译器必须为Java SE 6或7的注释处理器提供实例,有两种方法让我感兴趣的是代码片段I正在努力。我需要检查字段的类型是否是从特定抽象类继承的类型。似乎适用的两种方法是isAssignableisSubtype。但我不确定使用哪一种。

我已经检查了上述文档中引用的Java语言规范的那些部分。我理解子类型和赋值转换的概念之间的区别(至少我认为我这样做)。除非我弄错了,java.lang.Short不会是原语long的子类型(子类型是在原始语言中定义的,但不是在类和基元之间定义的),但是由于取消装箱和取消,它可以像这样分配扩大转换:

final Short s = 0;
final long l = s;

但是,我仍然不确定在我的情况下使用的最佳方法是什么。检查子类型似乎比可分配性更严格和更可取,但是当涉及到类时,感觉好像自动暗示另一个。

长版短:当比较的TypeMirrors同时用于类(不是接口或枚举)时,isAssignableisSubtype等效吗?

1 个答案:

答案 0 :(得分:1)

如果我们对参考文献进行了分配,那么在这种情况下唯一适用的转换是加宽参考转换(当然,除了身份转换)。现在我们有以下规则来执行它:

  

如果是S,则从任何类型S到任何类型T都存在扩展的引用转换   是T的子类型(§4.10)。

这意味着如果您只考虑类,那么您是否谈论子类型或可分配性并不重要。所以,是的,在这种情况下,提到的方法是等效的。