我通常使用 IntelliJ,但最近我的一位隊友在 eclipse 中打開了專案,他發現 eclipseType mismatch: cannot convert from Object to boolean在 2 個單獨的 java 檔案中顯示錯誤。我在 IntelliJ 中檢查過但沒有錯誤。
以下是分別來自 Eclipse 和 IntelliJ 的螢屏截圖:
蝕:

智能

我還檢查了兩個 IDE 是否具有相同的編譯器合規級別,即 11
蝕:

智能

即使 Eclipse 顯示錯誤,如果我在 Eclipse 中運行該專案,則構建和運行是成功的。
正如上面的實際代碼示例row物件是從介面創建的,我無權查看它的實際實作。因此只是為了生成場景,以便我可以理解兩個不同的 IDE 為什么以及如何表現不同?我創建了以下可重現的示例:
IRow.java:
public interface IRow {
<T> T getValue();
}
RowImpl.java
public class RowImpl implements IRow {
@SuppressWarnings("unchecked")
@Override
public <T> T getValue() {
return (T) Boolean.TRUE;
}
}
和 main.java
public class main {
public static void main(String args[])
{
IRow row = new RowImpl();
if(row.getValue()) //--> Eclipse shows error but IntelliJ not
System.out.println("value is true");
}
}
uj5u.com熱心網友回復:
Eclipse 使用自己的編譯器,與 javac 不同,這個錯誤似乎是編譯器實作不同的表現。
這是在他們的問題跟蹤器上提出的票。https://bugs.eclipse.org/bugs/show_bug.cgi?id=513766
Eclipse 編譯器開發人員似乎認為它是 javac 中的錯誤,而不是相反。所以也許問題應該是“為什么 javac 接受它”?此票證適用于 JDK https://bugs.openjdk.org/browse/JDK-8179483,由 Oracle 的語言設計師 Dan Smith 提出。他說“javac 應該拒絕這個程式”。
也就是說,如果他們洗掉此“功能”,我會感到非常驚訝。Oracle 不習慣進行向后不兼容的更改,這對于像您這樣的人來說是這樣的。一個更有可能的解決方案似乎是對規范進行調整以允許它,但我敢打賭它比表面上看起來更復雜,或者他們現在可能已經解決了這個問題。
我認為實際上這種行為的定義是模棱兩可的,理想情況下你應該避免依賴它。我會將您的代碼更改為
if(Boolean.TRUE.equals(row.getValue()))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/525347.html
標籤:爪哇蚀智能理念
