[英]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.