当为泛型方法传递方法引用时,如何进行拆箱和自动装箱?

时间:2017-08-22 20:09:50

标签: java autoboxing method-reference unboxing

这是一段代码:

@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

在这种情况下,不会发生自动装箱或拆箱。

任何人都可以回答为什么会这样吗?

0 个答案:

没有答案