1 回答
![?](http://img1.sycdn.imooc.com/545861f00001be3402200220-100-100.jpg)
TA贡献1817条经验 获得超14个赞
在IDEA 2018.3。中修复
(免责声明:IntelliJ IDEA开发人员在这里,负责此功能)。
简短答案:因为尚未实施。
当我们在数据流分析中跟踪变量的实际类型时,我们使用TypeConstraint类描述的模型。它允许我们跟踪两种事实:1)如果变量实际类型不是某事的instanceof,以及2)如果变量实际类型不是某事的instanceof。有了这些事实,我们可以在许多情况下推断出总是true /总是false的instanceof,例如:
void test(Object foo) {
if (foo instanceof String) {
if (foo instanceof Integer) {
// always false: "instanceof String" fact is not compatible
// with "instanceof Integer"
}
}
}
或者
void test(Object foo) {
if (!(foo instanceof Number)) {
if (foo instanceof Integer) {
// always false: "not instanceof Number" fact is not compatible
// with "instanceof Integer"
}
}
}
但是,对于您的情况,此模型还不够。我们需要扩展它以跟踪变量的确切类型。在你的代码中,我们跟踪one的instanceof One(这是兼容instanceof Two的事实),尽管该new表达式,我们可以知道,更精确的类型信息one的exactly One。这通常不可用,因为在大多数情况下(变量是方法参数,变量是从方法返回,变量是从字段,数组元素,转换表达式等分配的),我们无法知道类型是精确类型还是子类型,因此当前的模型是完全令人满意的。我可以想象只有两种情况可以使用exactly One事实跟踪:new表达式(如您的情况)和经过比较的如obj.getClass() == Xyz.class。
我认为,这是实施的合理功能。我已经考虑过了,但是除了我之外,还有其他人在乎我提出了一个问题,因此您可以进行跟踪。
添加回答
举报