一、前言
泛型这个词在现在的JAVA挺时髦,光从字面上你是无法知道它代表些什么东东的,所以我们还是不要从字面去理解,而是从一些实例去了解它吧。
二、泛型之前的日子
JDK1.4之前是没有泛型的概念的,所以我们才会有下面的代码:
List list = new ArrayListfl;
1ist. add(”aaaa”);
list. add(rrbbbbnr)s;
list. add(”cccc”);
for (Iterator it = list.iterator'; it.hasNextfl;)
String str = (String) it.nextfl;
System. out. println(str);
上面是一段很平常的代码,在一个List集合加入一些字符串,然后再用一个遍历循环把它打印出来。“String str = (String) it.next()”这一句我们可以看到List取出值都是Object,所以我们要得String型,还要做一个类型转换,真是麻烦。更麻烦的是list.add(Object obj)的参数是Object类型,所以如果我们一不小心把list.add("cccc");写成list.add(new Integer(76));程序在循环打印的类型转换中就会出错。
问题:我们能不能让add方法只认String型呢?
回答:可以!用JDK5.0的泛型。
三、泛型后的幸福生活
JAVA有了泛型后,就象十年的老光棍讨了老婆,那个好处自不待言。我们来看看上面的例子改成泛型的写法是怎么样的:
Listcstring> list = new Arraytist<string>O;
list.add(”saaa");
liat.add(”bbbb”)l;;
list.add(”cccc’9l;;
for (Iterator<string> it = list.iteratorfl; it.hasNextOs;)
string strsit.next C);
Systenn.out.println(str);
看到差别了吗?泛型其实很简单,就是在定义类型的后面加上"<类型>"这样子的声明就行了,它主要还有以下差别:
• list.add方法只能接受String类型。list.add(new Integer(76))这样的语句不需要运行程序,在编译时就会检查通不过。
• it.next()的返回值不再是Object,而变成了String
当然我们其实在循环部份也可以象下面这么写,是不是简洁了很多呢 :-)
List<String> list = new ArrayList<String>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
for (String str : list) {
System.out.println(str);
}
当然需要说明的是,List不仅可以List<String>,也可以是List<Integer>等等其他任何类型。
四、更深入了解泛型
(1)层层推进的泛型声明
“List<List> list;”表示什么呢?就是只接收List型的参数,比如:
List<List> list = new ArrayList<List>();
list.add(new ArrayList());
list.add(new Vector());
list.add(new LinkedList());
这里要注意List是接口,ArrayList、Vector、LinkedList都是这一接口下的实现类。下面这个有点怪异了,“List<List<String>> list;”表示它只接受List型的参数,而且这种List型的参数又是只是只接受String型,有点层层推进的味道在里面了。
ListCistcstring>> list = new ArrayListCist<string>>O;
list.add(new ArraytistcString>Q);
list.add(new vector<String>() ;
list.add(new LinkedList<string>());
(2)使用泛型上限通通配符:extends
这里要着重强调一点:变量的泛型声明和方法的参数的泛型声明有很大差别。
变量声明成某类型,同时也可以接受它的子类。比如说Integer、Long、Float都是抽象类Number的子类,所以下面的代码一点问题也没有:
List<Nuzthers 1ist = net.i ArrayList<Nunber>fl;
list.add(new Integer(1));
list.add(new Long(1));
list.add(neN Float(1.2)!);t
但如果换成方法参数的泛型声明则要严格得多了:子类也是不行的。比如下面的代码就是错误的,因为printList参数只接受Number值的List,就是是Number子类的Integer值的List也不行。
public static void main(String[] args)
List<Integer> list = new ArrayList<Integer>Q;
list.add(new Integer(1));
list.add(new Integer(2));
printIist (list);
private static void printlist(List<Nunber> list) {
for (Number nuni list)
System. out . println (nun’i) ;
上面代码修改的方法有两个,如下
修改方法一:改变量的泛型声明
将 List<Integer> list = new ArrayList<Integer>();
改为 List<Number> list = new ArrayList<Number>();
修改方法二:用界限通配符改方法参数的泛型声明
将 printList(List<Number> list)
改为 printList(List<? extends Number> list)
说明:extends 的含义就是表示参数可以接受Number型的子类。
(3)使用泛型下限通通配符:super
在上限就有下限,下限行就是super,用法和extends一样,含义则和extends相反。比如printList(List<? super Integer> list)表示参数可以接受Integer型及Integer型的超类,即Number了,当然也包括Object这个顶级类。
(4)配置符:?
?表示可以接受任何类型,不过我觉得它用得不多,因为printList(List<?> list)和printList(List list)的作用是一样的。
五、创建一个支持泛型的类
(1)创建一个泛型的类
public cla5s Point<T>
T x;
T y;
public T getx( {
return x;
public T gety(
return y:
publie void 5etX(T x)
thia.x = x;
public void setY(T 7) {
this.y =
使用这个类的代码如下:
Point<Integer> p = new Point<Integer>Q;
p.setX(new Integer(1)):
p.setY(new Integer (2))n;r
Pointxstring> b = new PointrString>lf;?
b.setX(”1”)
b.setY(”2”) ;
说明:在Point<T>的定义中,T并非关键字,你也可以这样定义Point<ABC>,当然一般还是写T吧,简单也规范。
(2)泛型类的继承与实现
java.util.Comparator类是JDK里用来排序的,其源代码如下:
package java. util;
public interface comparator<T> (
mnt connpare(T o1, T o2h;
boolean equals(Object obj);
一个实现此接口的类如下:
public class MyComparator<T> implements Comparator<ObjectInstance> {
public int compare(ObjectInstance o1, ObjectInstance o2) {
String s1 = o1.getObjectName().getCanonicalName();
String s2 = o2.getObjectName().getCanonicalName();
return s1.compareToIgnoreCase(s2);
}
}
说明:ObjectInstance可能大家还太明白,这是我实际项目中的一段代码(关于JMX的),ObjectInstance全称javax.management.ObjectInstance。MyComparator的使用代码如下:
Setset= .
ListczObjectinstance> mbeans = new ArrayList<Objectlnstance>(set);
Collections.sort(mbeans, new MyComparator<Objectlnstance>O);
六、最后的感言
JAVA有了泛型就象老光棍讨了老婆,好处大大的,但和女人一样麻烦也跟着来了:它的严格类型检查,使隐藏的BUG更少。有些地方确实也使代码简洁了,有些地方却会使得代码更复杂。所以运用之妙在于是否用得适当,尽量把泛型往简单里用,别越搞越复杂了。
分享到:
相关推荐
2. **泛型(Generics)**:泛型是JDK 5.0最重要的特性之一,允许在类、接口和集合中定义类型参数,提高了代码的重用性,减少了类型转换的错误,增强了编译时的类型检查。 3. **自动装箱与拆箱**:JDK 5.0中,原始...
Java JDK 5.0,又称为JDK 1.5,是Java开发工具包的一个重要升级,它引入了大量的新特性和改进,极大地提升了Java编程的...而"jdk5.0新特征.txt"则可能包含了对所有新特性的详细描述和使用示例,是深入学习的好资源。
总结来说,JDK5.0是Java发展中的关键版本,引入了泛型、枚举、自动装箱/拆箱等新特性,极大地简化了编码。正确下载、安装并配置JDK5.0后,就可以开始愉快的Java编程之旅,而"HelloWorld"则是学习任何编程语言的第一...
以上就是JDK 5.0中的一些重要新特性,这些特性极大地推动了Java语言的发展,使其在软件开发领域保持了强大的竞争力。通过学习和掌握这些特性,开发者可以编写出更加高效、健壮和易于维护的代码。
泛型是JDK 5.0中最关键的特性之一,它允许我们在类、接口和方法中使用类型参数,从而在编译时就能检查类型安全。泛型帮助我们避免了运行时的`ClassCastException`,因为它们确保了集合和容器中存储的数据类型与预期...
### JDK 5.0 新特性详解 #### 一、增强的 for 循环(ForEach Loop) JDK 5.0 引入了增强的 `for` 循环,也称为 foreach 循环,用于简化对集合和数组的操作。这种循环语法更加简洁,易于阅读。 **示例代码:** ``...
JDK5.0是Java开发的一个重要里程碑,它引入了11个主要的新特性,极大地提升了编程效率和代码安全性。以下是对这些特性的详细说明: 1. 泛型(Generic) 泛型的引入是为了解决类型安全问题,避免在运行时进行不必要...
在这个名为“JDK5.0新特性源代码”的压缩包中,我们可以期待找到与这些关键特性相关的源代码示例。以下是JDK 5.0引入的一些核心新特性及其详细解释: 1. **泛型(Generics)**:泛型允许在类、接口和方法中声明类型...
泛型是JDK 5.0引入的一项重大新特性,极大地提高了Java编程的类型安全性和效率。泛型允许我们在定义类、接口和方法时使用类型参数,而不是具体的类型,这样在编译期间就能进行类型检查,防止了运行时可能出现的...
通过深入学习《良葛格JDK5.0学习笔记》,开发者能够全面了解并熟练运用这些新特性,提升代码质量和效率,更好地适应Java编程的新时代。这份笔记对于Java初学者和有一定经验的开发者来说都是一份宝贵的参考资料。
JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进。但是,对于初次使用泛型类型的用户来说,泛型的某些方面看起来可能不容易明白,甚至非常奇怪。在本月的“Java 理论和实践”中,Brian Goetz 分析...
JDK 5.0的最大亮点之一就是泛型的引入。泛型允许在定义类、接口和方法时指定类型参数,从而提高了代码的类型安全性,减少了类型转换的必要,并降低了运行时错误的可能性。例如,ArrayList就是一个泛型类,T代表了...
4. **增强的for循环(Enhanced For Loop)**:也称为foreach循环,是JDK 5.0引入的新特性,简化了遍历数组和集合的操作。如`for (Type item : arrayOrCollection) { ... }`。 5. **变量注解(Variable Annotations...
Java JDK 5.0是Java开发的一个里程碑版本,它引入了许多重要的新特性和改进,极大地提升了开发效率和代码质量。良葛格的Java JDK 5.0学习笔记是一份宝贵的资源,适合初学者和有经验的开发者回顾这个版本的关键概念。...
Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。这里,我们将详细探讨这个版本的关键知识点,帮助初学者更好地理解和掌握Java编程。 1. **自动类型推断(var...
JDK 5.0是一个重要的里程碑,它引入了许多创新特性,极大地提升了Java的效率和可维护性。这篇文档将详细解析JDK 5.0中文版API,帮助初学者和有经验的开发者更好地理解和利用这一强大的资源。 ### 类库概述 JDK 5.0...
1. 泛型(Generics):这是JDK5.0最显著的改进之一,泛型允许开发者在定义类、接口和方法时指定类型参数,增强了类型安全,减少了强制类型转换,并提高了代码的重用性。 2. 自动装箱/拆箱(Autoboxing and Unboxing...
**Jdk5.0泛型**是Java编程语言的一个重要特性,它于2004年随着Java Development Kit (JDK) 5.0的发布引入。泛型为Java提供了类型安全,允许开发者在编译时检查类型,避免了运行时的类型转换异常。这一特性极大地提高...
JDK 5.0,也被称为Java SE 5.0,是Java发展历程中的一次重大更新,引入了许多关键性的新特性,对Java编程语言产生了深远影响。以下是对这个版本中核心知识点的详细解释: 1. **泛型(Generics)**:泛型是JDK 5.0...