黑马程序员技术交流社区

标题: 关于泛型 [打印本页]

作者: 于星星    时间: 2012-7-27 15:55
标题: 关于泛型
本帖最后由 于星星 于 2012-7-28 00:20 编辑

在学习泛型的时候有一个疑惑,就是这种方式public <T extends X> void Test(T t) {...}感觉和public void Test(X t) {...}效果是一样的,
那为什么要用泛型呢?
作者: 黑马连家华    时间: 2012-7-27 15:59
这种方法限定了T必须为x的子类

作者: 李菁    时间: 2012-7-27 16:06
public <T extends X> void Test(T t) {...}
这样写的话T必须是X的实现类或者子类,使规定的类型更具体
作者: 乐峰    时间: 2012-7-27 16:10
public <T extends X> void Test(T t) {...}
这种写法是做泛型的限定,类型只可以接收X类型或者X类型的子类型。这是规定了上限。
public void Test(X t) {...}
这种写法是在方法上定义泛型,类型只能接收X类型的,别的类型都不行。
定义这种泛型方式是因为当要操作的引用数据类型不确定的时候,早期定义object来完成扩展,现在定义泛型来完成扩展,这是JDK1.5的新特性。
作者: 王程    时间: 2012-7-27 16:33
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:47
聂峰 发表于 2012-7-27 16:10
public  void Test(T t) {...}
这种写法是做泛型的限定,类型只可以接收X类型或者X类型的子类型。这是规定 ...

回答的很好兄弟 O(∩_∩)O~
作者: 乐峰    时间: 2012-7-27 17:04
黑马振鹏 发表于 2012-7-27 16:47
回答的很好兄弟 O(∩_∩)O~

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

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

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

还有就是泛型不需要强制转换,可以隐式的自动转换,提高了代码的效率。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2