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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于星星 中级黑马   /  2012-7-27 15:55  /  1779 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于星星 于 2012-7-28 00:20 编辑

在学习泛型的时候有一个疑惑,就是这种方式public <T extends X> void Test(T t) {...}感觉和public void Test(X t) {...}效果是一样的,
那为什么要用泛型呢?

9 个回复

倒序浏览
这种方法限定了T必须为x的子类

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
public <T extends X> void Test(T t) {...}
这样写的话T必须是X的实现类或者子类,使规定的类型更具体

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
public <T extends X> void Test(T t) {...}
这种写法是做泛型的限定,类型只可以接收X类型或者X类型的子类型。这是规定了上限。
public void Test(X t) {...}
这种写法是在方法上定义泛型,类型只能接收X类型的,别的类型都不行。
定义这种泛型方式是因为当要操作的引用数据类型不确定的时候,早期定义object来完成扩展,现在定义泛型来完成扩展,这是JDK1.5的新特性。

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public <T extends X> void Test(T t) {...}
写法限定了泛型的上限,类型只接收X类与X类的子类
public <E super X> void Test(E e) {...}
写法限定了泛型的下限,类型只接收X类与X类的父类
public static <T> void Test(T t){....}是普通泛型方法
回复 使用道具 举报
聂峰 发表于 2012-7-27 16:10
public  void Test(T t) {...}
这种写法是做泛型的限定,类型只可以接收X类型或者X类型的子类型。这是规定 ...

回答的很好兄弟 O(∩_∩)O~
回复 使用道具 举报
乐峰 中级黑马 2012-7-27 17:04:38
7#
黑马振鹏 发表于 2012-7-27 16:47
回答的很好兄弟 O(∩_∩)O~

哦了,以后多交流
回复 使用道具 举报
黄锐 初级黑马 2012-7-27 23:04:37
8#
1. Runnable是一个接口,应用实现而不是继承
2. 假若父类X能够被子类T继承,T可以重写X中的一个方法,也可以几个,是任意选择的,而实现某个接口,就必须重写它的所有方法,对于Runnable中只有一个run方法,所以对于lz说的没有区别是不对的,,首先假设Runnable是一个类(实际是接口)的话,在第一种语句中,t是T的引用,是Runnable子类的引用,可以调用run方法也可以不调用run方法,重要的是这个run方法可能会被重写,内容改变了,而第二种的t是Runnable的一个引用,调用的run方法就只能是Runnable自身的没被重写的run方法,是有区别的
回复 使用道具 举报
1.泛型就是允许在定义类。接口。方法时使用类型形参,该类型形参将在声明变量,创建对象,调用方法时动态的指定,也就是传入实际的类型参数(类型实参)。
2.<T extends X>为类型形参设定上限,表明该类型形参T必须是其父类X的子类或是父类本身。
回复 使用道具 举报
这样使得T必须是X的实现类或者子类,限定了泛型的上限,只接收X类型或者X类型的子类型。

那么为什么使用泛型的原因是:

使用泛型是为了编译时出现错误了能及时提醒,这样就提高了安全性。另外,也是限定要操作的对象类型。

还有就是泛型不需要强制转换,可以隐式的自动转换,提高了代码的效率。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马