据我了解,以下代码应打印equal
,因为这两个元素都是false
。
来自java docs,Array.get()将返回:
返回指定数组中索引组件的值 宾语。如果该值具有,则该值将自动包装在对象中 原始类型。
但是,当我运行以下代码时,它正在打印
public class Test1 {
static boolean equalTest(Object array1, Object array2) {
return Array.get(array1, 0).equals(Array.get(array2, 0));
}
public static void main(String[] args) {
int[] a = new int[1];
byte[] b = new byte[1];
a[0] = 3;
b[0] = 3;
System.out.println(equalTest(a, b));
}
}
:
B = regexp(a, ':', 'split');
C = vertcat(B{:});
D = str2double(C); %D = cellfun(@str2num, C); also works but slower
我的问题是,实现号码的类不是或者应该直接相互比较。
答案 0 :(得分:11)
这与数组无关。您的比较等同于:
Object x = Integer.valueOf(3);
Object y = Byte.valueOf((byte) 3);
boolean equal = x.equals(y);
永远不会返回true
。
即使您的原始数组属于基本类型,Array.get
也会返回Object
,因此您可以获取已装箱的类型 - 并比较这些不同类型的值。
答案 1 :(得分:2)
根据Array.get(Object array,int index)
方法的documentation,如果对象具有基本类型,则返回的值将自动包装在对象中。因此,如果添加以下行:
System.out.println(Array.get(array1, 0).getClass());
System.out.println(Array.get(array2, 0).getClass());
您将看到输出
class java.lang.Integer
class java.lang.Byte
equals
类的Integer
方法首先检查它所比较的对象是否也是Integer
的实例,如果没有,则不需要进一步检查,他们不平等。
这就是你看到输出为假的原因,因为被比较的对象是相等的Integer
和Byte
。
答案 2 :(得分:1)
Array.get
次调用返回Integer
和Byte
个对象实例。根据{{1}},这些不相等,因为类类型不同。
答案 3 :(得分:0)
阵列数据类型不匹配。一个是int
,另一个是byte
。由于它们作为对象传递给函数,因此它们最终会成为Integer
和Byte
。因此,为了正确地比较它们,您需要将它们类型转换为相同类型。类似的东西:
static boolean equalTest(Object array1, Object array2) {
int int1 = (int) Array.get(array1, 0);
int int2 = (int) Array.get(array2, 0);
return int1.equals(int2);
// OR return int1 == int2;
}
答案 4 :(得分:0)
问题是val decodeMessage = udf { bytes:Array[Byte] =>
val dr = deser.deserialize("topic.name", bytes).asInstanceOf[DeviceRead]
// do additional transformation here so you use a custom streaming-specific class
// Here I'm using a simple tuple to hold what might be relevant
// You could create a case class instead to have proper names
(dr.id, dr.value)
}
方法返回一个对象,因此对于Array.get()
它将返回int
,对于Integer
,它将返回{{} 1}}。因此,byte
方法将返回false,因为它首先查看类型是否相同,然后比较值。
答案 5 :(得分:0)
如果您查看Array.get
的JavaDoc,您会看到:
如果对象具有基元,则会自动将其包装在对象中 类型。
因此,byte
成为Byte
,int
成为Integer
。
这意味着您正在调用的功能是Integer.equals(Object)
这是这样实现的:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
你没有传递Integer
,你传递的是Byte
,这就是它返回false的原因。