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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏格拉底的弟子 黑马帝   /  2012-1-30 10:04  /  2645 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 苏格拉底的弟子 于 2012-1-30 22:46 编辑

java泛型中<?>和<T>有什么区别?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

4 个回复

倒序浏览
使用<T>来声明类型持有者名称,自定义泛型类时,类持有者名称可以使用T(Type),如果是容器的元素可以使用E(Element),若键值匹配可以用K(Key)和V(Value)等,若是<?>,则是默认是允许Object及其下的子类,也就是java的所有对象了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
?是通配符..接收的是未知类型,,
T是指定的类型..

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
<?>可以接受的是未知的类型
<T>接受的是制定的类型,看了下面一段代码就会明白的
利用反射中的Constructor类获取一个String对象
  1. public static void main(String[] args)throws Exception{
  2.                 //方法1
  3.                 Constructor<?> constructor1 =Class.forName("java.lang.String").getConstructor(String.class);
  4.                 String str1 =(String) constructor1.newInstance("abc");
  5.                 //方法2
  6.                 Constructor<String> constructor2 = String.class.getConstructor(String.class);
  7.                
  8.                 String str2 =constructor2.newInstance("abc");
  9.                
  10.                 System.out.println(str1);
  11.                 System.out.println(str2);
  12.         }

  13. }
复制代码
方法1中就是用的通配符<?>
方法2中Constructor类中是具体String类
若是方法1中是Constructor<String> constructor1 =Class.forName("java.lang.String").getConstructor(String.class);
则代码应该改成Constructor<String> constructor1 =(Constructor<String>)Class.forName("java.lang.String").getConstructor(String.class);

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1 赞一个!

查看全部评分

回复 使用道具 举报
?是一个通配符,T只是一个字符。
<?   extends   list <String> >   与 <T   extends   <List> > 在这儿不具有对比性。
?在这儿是指该函数可以接受List <?> 型参数,而T则指相应函数可以接受List类型或者其子类型的参数。
觉得就是 你不能把对象放进一个未知类型的集合中去。而T呢
英文版pdf下载链接:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马