我目前遇到一个奇怪的情况,似乎某些 TypeAnnotation 坐标/路径数据最终被删除。下面的界面虽然显然不是您在实际代码中看到的任何内容(这仅用于实验目的),但产生的坐标数据似乎已被删除。
public interface WhackedOutCoordinates<M extends
@Whoopy Derpable<@Whoopy ? extends Comparable<@Whoopy M>>
&@Whoopy Comparable<@Whoopy List<? super @Whoopy M>>
&@Whoopy Serializable> {}
javap的输出如下:
0: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1
1: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0)]
2: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0), WILDCARD, TYPE_ARGUMENT(0)]
3: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
4: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
5: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
6: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=3
类签名的第二部分相交
@Whoopy Comparable<@Whoopy List<? super @Whoopy M>>
似乎所有类型参数注释都指向一个位置,由
指示3: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
4: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
5: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
我们可以看到类签名的第一部分相交
@Whoopy Derpable<@Whoopy ? extends Comparable<@Whoopy M>>
保留由
指示的注释类型引用/坐标/路径数据0: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1
1: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0)]
2: #10(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0), WILDCARD, TYPE_ARGUMENT(0)]
是什么导致类签名相交的第二部分丢失注释的内部位置?
最佳答案
我发现这似乎是由 eclipse (特别是 MARS)使用的任何编译器引起的。 使用 javac 编译后,得到以下 javap 输出:
0: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1
1: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0)]
2: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=1, location=[TYPE_ARGUMENT(0), WILDCARD, TYPE_ARGUMENT(0)]
3: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2
4: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2, location=[TYPE_ARGUMENT(0)]
5: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=2, location=[TYPE_ARGUMENT(0), TYPE_ARGUMENT(0), WILDCARD]
6: #8(): CLASS_TYPE_PARAMETER_BOUND, param_index=0, bound_index=3
忽略 Eclipse 扔到常量池中的额外内容(因此是 #8(来自 javac 版本)而不是 #10(来自 eclipse 版本)),我们现在可以看到,当使用 javac 编译时,相交的第 2 部分现在拥有其所有坐标数据。
如果有人知道 Eclipse 编译器配置中的任何内容可能导致它删除位置数据(即某种奇怪的优化形式),请告诉我,否则我会将其报告为错误。
关于java - 类型注释位置删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504562/