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