我是input[,1]+input[,1]
的新手。我现在正在学习java
中的非原始Integer类型。
我知道以下比较无效并引发编译错误 -
java
上面的代码片段给了我 - " Test.java:lineNumber:无法比较的类型:java.lang.String和char"错误。
但是我发现以下代码片段编译得很好 -
String str = "c";
Char chr = 'c';
if(str == chr) return true;
这里,int a = 1234;
Integer aI = 1234;
if(a==aI) return true;
是原始int,a
是非原始的。那么它们如何可比?我是编程新手,可能有任何我不知道的事情。
由于
答案 0 :(得分:4)
第二个代码段演示了取消装箱转换。拳击转换允许将原始类型隐式地转换为特定的对象包装类型,例如, int
< - > Integer
。
与==
运算符进行比较时,如果一个操作数是基本类型而另一个是包装类型,则执行拆箱转换,以便比较2个原始值。
第一个代码段无法编译,因为String
和char
之间没有装箱/拆箱关系 - 相关关系为Character
< - > char
。
Section 5.1.8 of the JLS指定所有拆箱转化:
- 从类型Boolean到类型boolean
- 从类型字节到类型字节
- 从短类型到短类型
- 从类型字符到类型字符
- 从类型Integer到类型int
- 从类型Long到类型长
- 从类型Float到类型float
- 从类型Double到类型double
Section 5.1.7指定所有拳击转换,所有这些都与上述相反。
答案 1 :(得分:2)
这称为unboxing
。这里aI是非原始/引用类型。这里Integer是原始int的包装器。它对原始int提供了一些易于使用的操作。例如,每个基本类型( boolean,byte,char,short,int,long,float,double )都有相应的包装类型(布尔,字节,字符,短,整数,长,浮动,双重)。
因此,当a
与aI
进行比较时,首先将aI
取消装箱并成为原始int,并将其值与原始int进行比较。这意味着它相当于 -
int a = 1234;
Integer aI = 1234;
int a2 = aI.intValue();
if(a == a2) return true;
对于第一次比较,比较发生在完全两种不同的数据类型之间 - String
和char
。在这种情况下,默认情况下,java中没有定义将char
转换为String
或String
转换为char
的规则。
答案 2 :(得分:0)
在第一种情况下,两种数据类型不同。所以他们无法比较。
在第二种情况下,两种数据类型也不同,但包装器Integer
用于支持原始int
。因此,JVM自动完成包装器(拆箱)Integer
到int
的转换,然后进行比较。所以实际上在第二种情况下,最后将两个原始int
相互比较。