1 回答

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。
我認為,這是實施的合理功能。我已經考慮過了,但是除了我之外,還有其他人在乎我提出了一個問題,因此您可以進行跟蹤。
添加回答
舉報