A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bullfrog 中级黑马   /  2014-9-10 17:06  /  1052 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bullfrog 于 2014-9-14 10:53 编辑

...............

评分

参与人数 1黑马币 +4 收起 理由
格子、 + 4

查看全部评分

8 个回复

倒序浏览
这里的T代表你要限定的类型,可以是任意引用类型.比如定义为String 那么里面的所有T都代表了String.其他类型同理
回复 使用道具 举报
Fightin黑马 发表于 2014-9-10 20:46
这里的T代表你要限定的类型,可以是任意引用类型.比如定义为String 那么里面的所有T都代表了String.其他类型 ...

如果函数定义成 <T> T convert(T obj){}  我大概还能理解,但是在视频里是写成
<T> T convert(Object obj)的
如果在形式参数那里不写T,写Object,  T难道也一样有效吗?


41_自定义泛型方法的练习与类型推断总结.avi  2分50秒开始
回复 使用道具 举报
bullfrog 发表于 2014-9-10 21:20
如果函数定义成  T convert(T obj){}  我大概还能理解,但是在视频里是写成
T convert(Object obj)的
如 ...

他表示的传入的参数是Object的类型的,T是泛指的概念,在平时用的时候如果你不知道要传入的是什么类型的时候就是用T,然后进行限定,另外这里的T并不代表你也要写成T 你写成别的字母也没关系.视频里传入的Object的,Object是所有类的父类,这里面又包含了父类引用指向子类对象的应用.这也是为什么下面代码取出的时候有一个T类型的强制转换
回复 使用道具 举报
Fightin黑马 发表于 2014-9-10 21:28
他表示的传入的参数是Object的类型的,T是泛指的概念,在平时用的时候如果你不知道要传入的是什么类型的时 ...

不行的,我刚刚试了一下。
  1. public class Try {

  2.         public static void main(String[] args) {
  3.                 Object s1 ="abc";
  4.                 Integer i = 9;
  5.                 Boolean bl = true;
  6.                 convert(s1).toUpperCase(); //如果确实转换成了String,这里是不会报错的,因为调用的String的方法。但是你试一下就知道是不行的
  7.         }

  8.         public static <T> T convert(Object obj){
  9.                 System.out.println((T)obj.getClass().getName());
  10.                 return (T)obj;
  11.         }
  12. }
复制代码
即使把Object s1 ="abc"; 写成 String s1 ="abc"; 那一行toUpperCase()也是编译报错。
最后强制转换 (T)obj,把s1转成了Object了。
所以形式参数中的应该是T obj, 这样才合理。


回复 使用道具 举报
bullfrog 发表于 2014-9-10 21:41
不行的,我刚刚试了一下。即使把Object s1 ="abc"; 写成 String s1 ="abc"; 那一行toUpperCase()也是编译 ...

convert(s1).toUpperCase();  这个地方你不能直接就后面加点来使用的,因为你的方法使用的是泛型,虚拟机并不知道返回的是不是String类型,也可能是其他的类型,但是其他类型里面并没有.toUpperCase()这个方法,所以编译报错,你必须告诉他返回的是一个String类型.可以改成
String s=convert(s1);
s.toUpperCase(); 这样就可以编译通过了

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

回复 使用道具 举报
Fightin黑马 发表于 2014-9-10 21:59
convert(s1).toUpperCase();  这个地方你不能直接就后面加点来使用的,因为你的方法使用的是泛型,虚拟机并 ...

好像真是这样,我还得琢磨一下,多谢解答!
回复 使用道具 举报
也学习了   
回复 使用道具 举报
clh 中级黑马 2014-9-11 02:32:54
9#
泛型,随便写,根据需要
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马