簡體   English   中英

沒有類型不匹配-從原始int到boolean的轉換

[英]No type mismatch - conversion from primitive int to boolean

考慮CopyOnWriteArrayList中的代碼段。

該方法的返回類型為原始布爾值,而返回原始int值。 正在使用的反編譯器是-

/ * Eclipse Class Decompiler插件,版權所有(c)2016 Chen Chao(cnfree2000@hotmail.com)* /

public boolean add(E paramE) {
    ReentrantLock localReentrantLock = this.lock;
    localReentrantLock.lock();
    try {
        Object[] arrayOfObject1 = getArray();
        int i = arrayOfObject1.length;
        Object[] arrayOfObject2 = Arrays.copyOf(arrayOfObject1, i + 1);
        arrayOfObject2[i] = paramE;
        setArray(arrayOfObject2);
        int j = 1;

        return j;              // ?????????
    } finally {
        localReentrantLock.unlock();
    }
}

反編譯器是錯誤的源,因為所選行中的代碼無法編譯,或者是否有其他原因?

如果您在此處查看代碼,則這些行是-

414     public boolean More ...add(E e) {
415         final ReentrantLock lock = this.lock;
416         lock.lock();
417         try {
418             Object[] elements = getArray();
419             int len = elements.length;
420             Object[] newElements = Arrays.copyOf(elements, len + 1);
421             newElements[len] = e;
422             setArray(newElements);
423             return true;
424         } finally {
425             lock.unlock();
426         }
427     }

這完全符合預期。

看起來是這樣。 以下是使用Java Decompiler (JRE 1.8.0_60)反編譯的以下代碼。

public boolean add(E paramE)
{
  ReentrantLock localReentrantLock = this.lock;
  localReentrantLock.lock();
  try
  {
    Object[] arrayOfObject1 = getArray();
    int i = arrayOfObject1.length;
    Object[] arrayOfObject2 = Arrays.copyOf(arrayOfObject1, i + 1);
    arrayOfObject2[i] = paramE;
    setArray(arrayOfObject2);
    return true;
  }
  finally
  {
    localReentrantLock.unlock();
  }
}

根據Java虛擬機規范的2.3.4節

盡管Java虛擬機定義了布爾類型,但它僅提供了非常有限的支持。 沒有Java虛擬機指令專門用於布爾值的操作。 相反, 將對布爾值進行操作的Java編程語言中的表達式編譯為使用Java虛擬機int數據類型的值。

因此,反編譯器在技術上是正確的,至少在字節碼級別,返回的變量是int。

有一個例外:布爾數組不等同於int數組:

Java虛擬機確實直接支持布爾數組。 在Oracle的Java虛擬機實現中,Java編程語言中的布爾數組被編碼為Java虛擬機字節數組,每個布爾元素使用8位。

Java沒有用於處理布爾值的指令(訪問布爾數組除外),它們以值0和1的int形式實現。

boolean a = true;
boolean b = false;

被編譯成

iconst_1
istore_1
iconst_0
istore_2

反匯編程序對此感到困惑。
事實上,所有小於int的整數基本類型都存儲為int(這不是問題,因為Java總是將較小的整型類型擴展為int)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM