interface New<T> {
boolean func(T n, T v);
}
class MyFunc<T>{
T val;
MyFunc(T val){
this.val = val;
}
void Set(T val){
this.val = val;
}
T Get(){
return val;
}
boolean isEqual(MyFunc<T> o){
if(val == o.val) return true;
return false;
}
public class Main {
static <T> boolean check(New<T> n , T a, T b){
return n.func(a,b);
}
public static void main(String args[]){
int a = 321;
MyFunc<Integer> f1 = new MyFunc<Integer>(a);
MyFunc<Integer> f2 = new MyFunc<Integer>(a);
boolean result;
//f2.Set(f1.Get()); //if i uncomment this line result become true
System.out.println(f1.val + " " + f2.val);
System.out.println();
result = check(MyFunc::isEqual, f1, f2);
System.out.println("f1 isEqual to f2: " + result);
}
}
为'a'
和f1
使用f2
时,为何结果为假?
为什么在f2.Set(f1.Get());
取消注释时结果为真?
请解释一下我在哪里弄错了。
答案 0 :(得分:5)
在.isEquals()
方法中,您将包装器对象与==
运算符进行比较,该运算符会比较对象引用(如果它们不在Integer
内部缓存中。
由于321
超出Integer
缓存,==
运算符返回false
,因为引用不同(f1
指的是不同的内存地址比f2
)。
当显式将引用设置为相等(使用f2.Set(f1.Get())
)时,程序输出true
并不奇怪。
如果您将a
设置为-128
和127
之间的某个位置,程序将输出true
。
答案 1 :(得分:3)
a
为auto boxed至Integer
,对于int a = 321;
,Objects
和f1
会有两个f2
。
例如
Integer a1 = new Integer(321);
Integer a2 = new Integer(321);
对于a1 == a2
,您将false
因为==
比较引用而不是值,您应该使用equals
方法检查isEqual
方法中的值。