繁体   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