`
温柔一刀
  • 浏览: 862411 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 范型编程

    博客分类:
  • java
阅读更多
1.一个简单的范型示例

在以前,你可能遇到过这样的代码:

1 List list  =   new  LinkedList(); 
2
3 list.add( " a " ); 
4
5 list.add( " b " ); 
6
7 list.add( " c " ); 
8
9 String name  =  (String)list.iterator.next(); 

注意,第三行需要强制转换。而使用范型:
 1
 2 List < String >  list  =   new  LinkedList < String > (); 
 3
 4 list.add( " a "
 5
 6 list.add( " b " ); 
 7
 8 list.add( " c " ); 
 9
10 String name  =  list.iterator.next(); 
11
12

这里将list声明成String类型的List。List是有一个类型参数的范型接口。这个例子中类型参数是String。

 
2.定义简单的范型

看j2se5.0中List和Iterator接口的实现(片断):
 1
 2 public   interface  List < E >   
 3
 4 {  
 5
 6 void  add(E x); 
 7
 8 Iterator < E >  iterator(); 
 9
10 }
 
11
12 public   interface  Iterator < E >   
13
14 {  
15
16 E next(); 
17
18 boolean  hasNext(); 
19
20 }
  
21
22

上面的代码我们比较熟悉,但是其中增加了尖括号。尖括号中的内容定义了接口List和Iterator的形式类型参数。类型参数可以用在范型声明中,如类和接口的声明。

一旦声明了范型,你就可以使用它。在上面的例子中使用了List<String>。这里使用String是实参,代替了形参E。如果使用List<Integer>,则用实参Integer代替了形参E。

不管List<Integer>还是List<String>,它们的类只有一个。考虑下面的代码:
1
2 List < String >  list1  =   new  LinkedList < String > (); 
3
4 List < Integer >  list2  =   new  LinkedList < Integer > (); 
5
6 System.out.println(list1.getClass() == list2.getClass()); 
7
 

输出结果为true。

 

一般来说,形式类型参数都是大写,尽量使用单个字母,许多容器类都使用E作为参数。

 

3.范型和继承

考虑下面的代码,你认为它会出错吗?

1
2 String s = " xxx@gmail.com "
3
4 Object o  =  s: 
5

当然,String类继承Object类,这样做不会出错。但下面的代码呢?

1 List < String >  s  =   new  LinkedList < String > (); 
2
3 List < Object > o = s; 
4


编译出错!

是的,List<Object>和List<String>没有继承关系。

 

4.通配符

考虑下面一个方法:

 1
 2 public   void  printCollection(Collection < Object >  c) 
 3
 4
 5
 6     for (Object o:c) 
 7
 8
 9
10    System.out.printf( " %s%n " ,o); 
11
12 }
 
13
14 }
 
15


事实上,上面这个方法并不通用,它只能打印Collection<Object>类型的集合,象其他的如Collection<String>、Collection<Integer>并不能被打印,因为对象类型不一致。

为了解决这个问题,可以使用通配符:
 1
 2 public   void  printCollection(Collection < >  c) 
 3
 4
 5
 6     for (Object o:c) 
 7
 8
 9
10    System.out.printf( " %s%n " ,o); 
11
12 }
 
13
14 }
 
15
16

Collection<?>被称作未知类型的集合。问号代表各种类型。

上面的读取集合中的数据时,我们采用Object类型。这样做时可以的,因为不管未知类型最终代表何种类型,它的数据都继承Object类,那么再考虑一下下面的代码:
1
2 Collection <?>  c  =   new  ArrayList < String > (); 
3
4 c.add( new  Object());   
5
6

这样做时错误的,因为我们不知道?代表何种类型,所以我们不能直接将Object增加到集合中,这会出现类型不匹配的情况。
 

5.有限制的通配符

考虑下面的代码
 1
 2 class  Man 
 3
 4
 5
 6     public  String name  = ""
 7
 8 }
 
 9
10 class  GoodMan  extends  Man 
11
12
13
14     public  String name  =   ""
15
16 }
 
17
18 class  BadMan  extends  Man 
19
20
21
22     public  String name  =   ""
23
24 }
 
25
26

考虑下面的范型方法:
 1
 2 public   void  printName(List < Man >  men) 
 3
 4
 5
 6     for (Man man:men) 
 7
 8    
 9
10       System.out.println( " 姓名: " +  man.name); 
11
12    }
 
13
14 }
 
15
16


这个范型方法只能显示List<Man>类型的数据,下面的代码允许显示Man和它的子类。
 1
 2 public   void  printName(List < ?  extends   Man >  men) 
 3
 4
 5
 6     for (Man man:men) 
 7
 8    
 9
10       System.out.println( " 姓名: "   +  man.name); 
11
12    }
 
13
14 }
 
15
16

这里使用? extends Man代替Man,表明接受任何Man的子类做为参数。

和前面的代码类似,下面的代码也是不正确的:
 1
 2 public   void  adman(List <?   extends  Man >  men) 
 3
 4
 5
 6    GoodMan good  =   new  GoodMan(); 
 7
 8    good.name  =   " zhupan "
 9
10    men.add(good); 
11
12 }
 
13
14

原因也很简单,因为?代表一切继承Man的类,你并不能保证就一定时GoodMan类。

 

和这种用法类似:
 1
 2 public   void  adman(List <?   super  GoodMan >  men) 
 3
 4
分享到:
评论

相关推荐

    Java 范型攻略篇

    ### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...

    C++ 设计新思维:范型编程与设计模式之应用

    《C++ 设计新思维:范型编程与设计模式之应用》是一本深入探讨C++编程技巧和设计原则的专业书籍,旨在帮助读者掌握利用范型编程和设计模式提升软件开发效率和可维护性的方法。书中的内容丰富多样,涵盖了C++语言的...

    Genetic Programming范型编程

    ### Genetic Programming范型编程 #### 一、引言与概览 遗传编程(Genetic Programming, GP)是一种基于自然选择原理的自动编程方法,它属于进化计算领域的一部分。该技术利用了生物进化的机制来自动地创建计算机...

    JAVA范型指南中文版

    Java 泛型是一种在编程中实现强类型检查和减少冗余类型转换的机制,它是在JDK 1.5版本中引入的。泛型的主要目标是提高代码的类型安全性、可读性和重用性,避免在运行时出现类型转换异常。 1. **泛型的基本概念** -...

    java范型[参照].pdf

    Java泛型是Java 5版本引入的一个重要特性,极大地增强了代码的类型安全性和可读性。泛型允许我们在编写代码时指定容器(如List、Set、Map等集合...在实际编程中,我们应该尽可能地利用泛型来编写更安全、更清晰的代码。

    java 泛型类的类型识别示例

    在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...

    七周七语言 理解多种编程范型

    《七周七语言:理解多种编程范型》这本书是一本编程领域的经典之作,旨在帮助读者在短时间内接触并理解多种不同的编程范型。编程范型是编程语言的核心思想和设计模式,理解它们对于提升编程能力至关重要。书中涵盖了...

    七周七语言:理解多种编程范型 中文高清版

    《七周七语言:理解多种编程范型》是一本旨在帮助程序员深入了解不同编程范型的著作。这本书由Bruce A. Tate撰写,于2012年由人民邮电出版社出版。作者通过详细介绍七种不同的编程语言,揭示了每种语言的核心特性和...

    用Java Socket实现一个简单的基于P2P范型的即时聊天系统。

    在本文中,我们将深入探讨如何使用Java的Socket编程来实现一个简单的基于P2P(Peer-to-Peer)范型的即时聊天系统。P2P网络架构允许每个节点既是客户端也是服务器,这种模式使得数据传输更加分散,提高了系统的可扩展...

    Java 泛型(Generics)使用说明

    另外由于“范型编程”(Generic Programming)的推广,于是2004年JDK 5.0引用范型标准。本例子说明演示了Java范型使用的动机、范型类的使用、范型方法的使用,以及范型的缺陷:类型擦除(type erasure).因为,现在Java...

    Java程序设计范型和枚举PPT教案学习.pptx

    Java程序设计范型和枚举是Java编程中的关键概念,它们极大地增强了代码的类型安全性和重用性。本文将深入探讨这两个主题。 首先,我们来看什么是范型(Generics)。范型是Java SE 5.0引入的一个特性,它允许在类、...

    一个很好的范型立例题

    Java范型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。范型在Java中引入的主要目标是增强类型安全,减少强制类型转换,并帮助开发者编写更清晰、更易于...

    主要程序设计语言范型综论与概要

    这些范型定义了编程语言的基本结构和约束,影响着代码的编写方式以及解决问题的思路。本篇文章将深入探讨几种主要的程序设计语言范型,并提供一个概述。 1. **过程式编程**:这是最早期的编程范型,其核心思想是...

    七周七语言:理解多种编程范型

    编程喜C#、Ruby、Haskell而厌Java。 白明 Neusoft某开发部技术总监,拥有多年电信级软件开发经验;资深C程序员,对Common Lisp、Python等小众语言也有涉猎;对开源软件有着浓厚的兴趣,曾先后贡献了lcut、cbehave等...

    主流编程语言比较(C,C++,JAVA等。。)

    本文将对主流编程语言进行比较,包括 C、C++、Java 等语言,并对每种语言的特性、优点和缺点进行了详细的分析。 一、语言特性对比 | 语言 | 类型 | 静态/动态 | 支持面向过程 | 支持基于对象 | 支持范型 | 支持...

    StudyJava:Java 基础学习(java编程思想和java技术核心卷)

    a)与“像是一个”(is-like-a)关系1.7 伴随多态的可互换对象1.8 单根继承结构1.9 容器1.9.1 参数化类型(范型)1.10 对象的创建和生命期1.11 异常处理:处理错误1.12 并发编程1.13 Java与Internet1.13.1 Web是什么...

    C语言泛型stack操作算法

    “泛型”一词通常在高级编程语言中出现,如Java或C#,用来表示可以处理多种数据类型的代码。然而,在C语言中,我们没有内置的泛型机制。但是,通过巧妙地使用void指针和类型转换,我们可以模拟泛型栈的实现,使得同...

Global site tag (gtag.js) - Google Analytics