3

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

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

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

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

长版短:当比较的 TypeMirror 都用于类(不是接口或枚举)时,它们是等效的吗isAssignableisSubtype

4

1 回答 1

1

如果我们对引用进行赋值,那么在这种情况下唯一适用的转换是扩展引用转换(当然,恒等转换除外)。现在我们有以下规则来执行它:

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

这意味着如果您只考虑类,那么您是否谈论子类型或可分配性都没有关系。所以是的,在这种情况下,上述方法是等效的。

于 2011-10-13T19:32:11.340 回答