这是一段代码:
@FunctionalInterface
interface NumericFunc<T>{
int fact(T[] a,T b);
}
class MyStringOps{
static <T> int counter(T[] a,T b){
int count=0;
for(int i=0;i<a.length;i++)
if (a[i]==b)
count++;
return count;
}
}
public class Numeric {
static<T> void stringOp(NumericFunc<T> ref,T[] a,T b){
System.out.println(ref.fact(a,b));
}
public static void main(String[] args) {
Integer ing[]={1,2,3,4,5,4,4,4,8};
String str[]={"one","two","three","two","four"};
stringOp(MyStringOps::<Integer>counter,ing,new Integer(4));
stringOp(MyStringOps::<String>counter,str,new String("two"));
}
}
以下代码的输出是: 0 0
这是相同的代码,但有点不同:
@FunctionalInterface
interface NumericFunc<T>{
int fact(T[] a,T b);
}
class MyStringOps{
static <T> int counter(T[] a,T b){
int count=0;
for(int i=0;i<a.length;i++)
if (a[i]==b)
count++;
return count;
}
}
public class Numeric {
static<T> void stringOp(NumericFunc<T> ref,T[] a,T b){
System.out.println(ref.fact(a,b));
}
public static void main(String[] args) {
Integer ing[]={1,2,3,4,5,4,4,4,8};
String str[]={"one","two","three","two","four"};
//Deviation from the previous code.Instead of Wrapper classes
//primitive type are used for argument to b.
stringOp(MyStringOps::<Integer>counter,ing,4);
stringOp(MyStringOps::<String>counter,str,"two");
}
}
输出: 4 2
我的问题是,当我们传递新的Integer(4)作为参数时,当执行计数器时执行NumericFunc或执行计数器时的清晰术语时,不应将新的Integer(4)解包为4并与之进行比较两个代码段的数组和输出应该保持不变。
if(new Integer(4)==4)
System.out.println(true);
对于这件作品输出是真的。 但是如果有一个Integer类型的数组,其中包含基本类型的元素,即在这种情况下为int(根据我应该将其自动装箱为Integer类型,然后应该存储在数组中)然后如果将它与Wrapper类型进行比较它返回false。 对于例如在上面的代码中有一个数组ing [],其中包含4个第三个索引。
if(ing[3]==new Integer(4))
System.out.println(true);
else
System.out.println(false);
输出:false
在这种情况下,不会发生自动装箱或拆箱。
任何人都可以回答为什么会这样吗?