问题描述
代码1:publicclassTest{publicstaticvoidmain(Stringargs[]){fun(12313213,"sfsfsf").print();}publicstatic<V>Info<V>fun(Vv1,Vv2){Info<V>temp=newInfo<V>();temp.setVar(v1);temp.setVal(v2);returntemp;}}classInfo<T>{privateTvar;privateTval;publicvoidsetVar(Tvar){this.var=var;}publicvoidsetVal(Tval){this.val=val;}publicTgetVar(){returnthis.var;}publicTgetVal(){returnthis.val;}publicvoidprint(){System.out.println(this.var+"t"+this.val);}}代码2:publicclassTest{publicstaticvoidmain(Stringargs[]){fun().setVar("sfasfa",123123);}publicstatic<V>Info<V>fun(){Info<V>temp=newInfo<V>();returntemp;}}classInfo<T>{privateTvar;privateTval;publicvoidsetVar(Tvar,Tval){this.var=var;this.val=val;System.out.println(var+"t"+val);}publicTgetVar(){returnthis.var;}}两段代码均可以打印出来一个int,一个String。但是在代码1中,fun(Vv1,Vv2)明明是要一样的类型的,怎么会编译通过呢?
解决方案
解决方案二:
int会调用autoboxing机制转换为Integer,然后Integer和String两种类型自动向上转型为Object,在Java中,一切类皆由Object派生。所以在这个泛型里的V,你可以理解为Object,但是v1、v2的运行时类型信息分别为Integer和String。
解决方案三:
你使用的并不是int这个基本数据类型,实际是java虚拟机将123123自动转换成了Integer这个对象,应为所有的对象都继承自object,所以只是把String和Integer当作两个对象来处理。