黑马程序员技术交流社区
标题:
泛型
[打印本页]
作者:
周敏2011nc
时间:
2011-12-21 17:40
标题:
泛型
本帖最后由 周敏2011nc 于 2011-12-27 08:52 编辑
泛型的作用有哪些方面,它的存在时期?
该贴已经同步到 周敏2011nc的微博
作者:
窦超
时间:
2011-12-21 17:46
泛型赋予了类型参数式多态的能力
泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。
作者:
余松霖
时间:
2011-12-21 17:55
泛型的好处是安全简单。在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
是java1,5之后的新特性,
作者:
为梦而战
时间:
2011-12-21 18:00
泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制
作用:1.将运行时期出现的问题:classCastException,转移到了编译时期,方便于程序员解决问题,让运行时候问题减少,安全
2.避免了强制转换麻烦
使用范围:类(生存期:在整个类中有效),方法,接口
特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上
作者:
冯瑞君老师
时间:
2011-12-21 18:10
本帖最后由 f64412300 于 2011-12-21 18:11 编辑
泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。
允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。
· 消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
· 潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。
作者:
陈帅雷
时间:
2011-12-21 18:17
型赋予了类型参数式多态的能力
泛型的第一个好处是编译时的严格类型检查。有效的避免了运行期的ClassCastException,提高了程序的安全性和健壮性。
这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。另外 泛型简化了代码,应用泛型的程序提高程序的可读性,更利于团队的合作开发
作者:
郭繁森
时间:
2011-12-21 19:01
本帖最后由 guofansen 于 2011-12-21 19:02 编辑
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(java.lang.String);
举个例子
有一个篮子工厂,负责生产篮子,但是这个篮子将来是用来做什么的,在设计它的时候并不能确定,有可能是装水果的,也有可能是装馒头的
实际上用的时候,你跟厂家说,我要水果篮子,于是厂家就生产水果篮子,但并不是重新设计制造,而只是在制造的时候把你的要求给记录下来,比如生产出来的篮子只能放你规定的东西,如水果,放其他的就不行,取出来的也是水果,就这样!
作者:
刘健
时间:
2011-12-21 21:49
泛型个人觉得最主要就是函数的重用上,一个函数在应用了泛型后可以接受更多的类型,减少了代码量,增强了代码的可读性
作者:
韩金蕊
时间:
2011-12-22 09:24
public interface Dao<T,PK> {
/**
* 插入实体
* @param entity
* @return
*/
boolean insert(T entity);
/**
* 更新实体
* @param entity
* @return
*/
boolean update(T entity);
/**
* 删除实体
* @param entity
* @return
*/
boolean delete(T entity);
/**
* 根据id删除实体
* @param id
* @return
*/
boolean deleteById(PK id);
/**
* 查询所有的实体对象
* @return
*/
List<T> findAll();
/**
* 根据id查询单个实体
* @param id
* @return
*/
T findById(PK id);
List<T> findNowPageInfo(int nowPage,int pageSize,String where);
}
这是定义一个泛型接口,当别的类实现它的时候,可以直接通过(T,pk)l来实现,比较简单安全,同时减少了类型转换的麻烦,有效的避免了运行期的ClassCastException,提高了程序的安全性和健壮性
作者:
周敏2011nc
时间:
2011-12-22 09:52
大家注意到一个问题没有 : 当我们用反射取到一个方法时,它会忽略泛型的信息 :
public class AzonalDemo {
public static void main(String[] args) throws Exception{
ArrayList<Integer> list = new ArrayList<Integer>();
String str = "abc";
Method method = list.getClass().getMethod("add", Object.class);
method.invoke(list, str);
System.out.println(list);
}
}
这是不是说明 : 泛型的存在时期只是在编译阶段,而且泛型的信息并不存在字节码中,通过反射拿到的字节码没有泛型信息?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2