黑马程序员技术交流社区
标题:
何谓泛型??
[打印本页]
作者:
想你的夜
时间:
2013-12-6 16:39
标题:
何谓泛型??
何谓泛型,一直都听说泛型,也用过。却没有真正理解,希望深入理解的大神可以讲解下,最好是理论和例子结合着讲述,谢谢了
作者:
史超
时间:
2013-12-6 16:52
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
可以在集合框架(Collection framework)中看到泛型的动机。例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象。
因为Map.get()被定义为返回Object,所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
要让程序通过编译,必须将get()的结果强制类型转换为String,并且希望结果真的是一个String。但是有可能某人已经在该映射中保存了不是String的东西,这样的话,上面的代码将会抛出ClassCastException。
作者:
荣晓鹤
时间:
2013-12-6 17:01
在没有泛型之前,一旦把对象丢进java集合中,集合就会忘记对换,这种强制类型转换不能使代码臃肿,而且容易引起代码异常
增加泛型后可以让代码更简洁,更加有健壮性
interface info<T> {
public void say();
}
// 直接在子类之后声明泛型
class hello<T> implements info<T>{
public static void main(String[] args){
info<String> demo = new hello<String>();
demo.say();
}
public void say(){
System.out.println("hello");
}
}
作者:
张天昊76
时间:
2013-12-6 20:54
使用泛型的主要优点是能够在编译时而不是在运行时检测出错误。
例如:下面不使用泛型的例子
ArrayList al = new ArrayList();
// 向al中添加元素
al.add("字符串");
al.add(new java.util.Date());
复制代码
上面的这个也就是说什么都可以存入集合中
下面这个使用泛型,指定集合中添加的元素只能是String类型的
ArrayList<String> al = new ArrayList<String>();
al.add("123");
al.add(123);//这里有个自动装箱的过程,此时这句活不能通过编译的
复制代码
这就是使用泛型的好处。
作者:
25343215
时间:
2013-12-6 21:00
13、泛型:
(1)为什么会出现泛型?
因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患,
如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题。
JDK1.5后出现了泛型,用于解决集合框架的安全问题。
泛型是一个类型安全机制。
(2)泛型定义格式:通过<>来定义要操作的引用数据类型
ArrayList<String> al = new ArrayList<String>;
(3)泛型的好处:
**将运行时期出现的ClassCastException(类型转换异常)问题转移到编译时期;
**避免了强制转换的麻烦
(4)什么时候定义泛型?
泛型在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可
(5)泛型的形式
**泛型类:即自定义泛型类
A:当类中要操作的引用数据类型不确定时,定义Object来完成扩展,现在定义泛型来完成
B:局限性:泛型类定义的泛型,在整个类中有效,如果该泛型类的方法被调用,
当泛型类的对象明确要操作的类型后,所有要操作的类型就被固定。
**泛型方法:泛型放在返回值前面,修饰符的后面
A:为了避免泛型类的局限性,让不同方法可以操作不同的类型,而且类型还不确定,
则可以将泛型定义在方法上
B:特殊之处:静态方法不可以反问类上定义的泛型
如果静态方法操作的应用数据类型不确定,可以讲泛型定义在静态方法上
**泛型接口:
当泛型定义在接口上时,则子类中要指定实现接口类型,同时还可以子类也可以定义为泛型类
(6)泛型的高级应用:?通配符
**当指定两种泛型的集合,则迭代时也要定义两种泛型的迭代器,麻烦,此时可通过将迭代器的泛型
改为?,如Iterator<?> it=al.iterator();
**两种泛型限定
向上限定: ? extends E ;E可以接收E类型或者E的子类
向下限定: ? super E ;E可以接收E类型或者E的父类
作者:
想你的夜
时间:
2013-12-6 21:17
荣晓鹤 发表于 2013-12-6 17:01
在没有泛型之前,一旦把对象丢进java集合中,集合就会忘记对换,这种强制类型转换不能使代码臃肿,而且容易 ...
谢谢你的解答
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2