亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

IntelliJ顯示instanceof為“ always true”提示,但不顯示

IntelliJ顯示instanceof為“ always true”提示,但不顯示

皈依舞 2021-05-04 17:57:25
因此,我使用IntelliJ IDEA在Java中進行編程,并且我嘗試使用該關鍵字,instanceof并且我的代碼最終看起來像這樣:public class Main {    public static void main(String args[])    {        One one = new One();        One two = new Two();        if (one instanceof Two)         {            System.out.println(one);        }        if (two instanceof Two)         {            System.out.println(one);        }    }}class One { }class Two extends One { }IntelliJtwo instanceof Two在行中給我一個提示“ [...]始終為真”,但是對于one instanceof TwoIntelliJ,我沒有給我一個“ [...始終為假”的提示。有人知道為什么嗎?
查看完整描述

1 回答

?
大話西游666

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。


我認為,這是實施的合理功能。我已經考慮過了,但是除了我之外,還有其他人在乎我提出了一個問題,因此您可以進行跟蹤。


查看完整回答
反對 回復 2021-05-19
  • 1 回答
  • 0 關注
  • 498 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號