请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

插入代码

1回答

提问者 Roger9943 2019-12-18 21:13:33


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static <T>T  test(T datas){
   return datas;
}
public static void main(String[] args) {
 
   String s="123";
   ServiceResponse a=creatBySuccess(s);
   ServiceResponse b=creatBySuccessMessage(s);
   ServiceResponse c=new ServiceResponse(0,s);
   ServiceResponse d=new ServiceResponse(0,"321");
   ServiceResponse e=new ServiceResponse(0,"123");
   ServiceResponse f=new ServiceResponse(0,test("123"));
   //new ServiceResponse(0,s);
   System.out.println("");
}

上面的测试代码可以帮助一下理解泛型,

我觉得就是<T>和String选择的问题上,creatBySuccess和creatBySuccessMessage相当于在上面包装了一层,泛型在最下面ServiceResponse()初始化的时候,要往上找到类型,

在ServiceResponse(<T>),ServiceResponse(String)选择的时候,creatBySuccess(<T>)是从return new ServiceResponse<T>(ResponseCode.SUCCESS.getCode(),data);中往上找到的data是T类型,也就是走的creatBySuccess(T)->ServiceResponse(T)->data这条路线,传的是T,不论T是不是String都要使用ServiceResponse(T)这个方法。

在creatBySuccess(<T>)中确定类型是T而不是String。直到正式编译的时候,再给String,那么String只能走这条路。

我画的图,便于大家理解。

,这是包装后的,就可以想让String走那条路就调用哪条。

不然默认调用String,第二张图就是String比<T>优先,

换个说法,就是把一开始程序判断ServiceResponse()参数的T还是String,给分开了,提前把数据处理为一个T一个String,不会发生让String和T数据混合一起的判断。

个人理解,多多包涵。

https://img1.sycdn.imooc.com/szimg/5dfa23af093fa7da06970661.jpg

https://img1.sycdn.imooc.com/szimg/5dfa247f09efb53d06690557.jpg

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号