`
myoldman
  • 浏览: 84844 次
  • 性别: Icon_minigender_1
  • 来自: 福建福州
最近访客 更多访客>>
社区版块
存档分类
最新评论

看起来很美--我也谈谈java5泛型

阅读更多
1.泛型的概念.
泛型英文名为(Generic Type),从字面上就是通用化,一般化了的类型.
类似于类是对象的一种抽象,泛型可以说就是对类进行抽象.
2.泛型的语法
[list]
  • 类型参数的形式化
  • 在java5中利用<E>这样的语法来定义形式化类型参数.
    public interface List<E> {
               void add(E x);
               Iterator<E> iterator();
    }
    

    以上代码中E就代表了一个形式化类型参数
  • 类型参数的实际化
  • List<Integer> myIntList = new LinkedList<Integer>();
    Integer x = myIntList.iterator().next();
    

    上述代码是java5以后经常看到的声明只能放某种对象的list,以用于加强编译器的类型安全检查.
    并且在取出list中的元素时也不需要进行强制的类型转化.
    [/list]
    3.泛型的种类
    [list]
  • 在类中声明的泛型
  • public interface List<E> {
               void add(E x);
               Iterator<E> iterator();
    }
    

    上面代码中的E就可以到作一个类来用,可以用于声明函数的参数(E x),也可以继续当作形式化类型参数传给其他泛型的声明(Iterator<E>)
  • 泛型化的方法
  •    static <T> void fromArrayToCollection(T[] a, Collection<T> c){
           for (T o : a) {
               c.add(o); // correct
           }
        }
    

    以上定义中的<T>定义了方法的形式化类型参数,该类型参数可以和类中定义的类型参数一起使用,但是该参数只能方法体的范围类有效.
    public class TestGeneric<E>
    {
    	public <T> void testOfMethodGeneric(T t,E e)
    	{
    		System.out.print(t);
    		System.out.print(e);
    	}
    }
    

    [/list]
    4.通配符和继承
    [list]
  • 除了形式化类型参数的声明,其他地方都可以使用通配符.
  •         List<?> testList = new ArrayList<String>();
    	public void testOfWildCard(List<?> list)
    	{
    		
    	}
    

    ?的语义是表示任意的类型.List<?>就表示可以接受任何类型数据的集合,但是这样用一个限制就是不能往集合中插入任何元素(除了null,因为null是所有类型的成员),因为编译器也不知道集合中的元素类型是什么.
  • 通配符可以加入上下限的限制.
  • <? extends Father>表示匹配所有继承自father的类型(包括father,son,grand child等).
    <? super Father>表示匹配所有Father所继承的类型(包括father,grandpa,grandma等).
  • 通配符的用意
  • List<String> ls = new ArrayList<String>(); //1
    //由于定义泛型的时候并没有使用通配符,会导致编译期的类型转化错误.具体原因请看后续代码
    List<Object> lo = ls; //2
    lo.add(new Object()); // 3
    String s = ls.get(0); // 4: 试图把Object赋值给String
    

    有了通配符,在泛型使用的时候对子类类继承的功能就可以扩展.
    但是给人感觉这个可能是因为编译器处理不了,结果我们就非得要手动声明.
    [/list]
    5.使用要点
    [list]
  • 泛型类是共享(实际上的意思就是泛型类中的形式化类型参数是与泛型类的某个实际对象绑定的,不能在泛型类的static语义的代码断中调用形式化类型参数
  •        
           List<String> l1 = new ArrayList<String>();
           List<Integer> l2 = new ArrayList<Integer>();
           System.out.println(l1.getClass() == l2.getClass())//true
    

    public class TestClient<E>{
    	private static E e;//编译错误提示静态不能应用非静态内容.
    	private E e1;//可以通过
    }

    进一步推论可以得出一个结论如下代码也是没有意义的
          
           Collection cs = new ArrayList<String>();
           //下面这句话是没有意义的从编译器得到的错误信息感觉由于
           泛型化的信息只在编译器有效,运行期被擦除了,导致运行期间根本就没有Collection<String>这样一个类.
           if (cs instanceof Collection<String>) { ...} // 
    
  • 除了数组其他对象都嵌套的使用形式化类型参数定义.
  • List<String>[] lsa = new List<String>[10]; // not really allowed

    以上定义是非法的
  • Class对象的泛型化
  • java5中Class类的声明带有一个类型参数T其用途如下
    String.class类型代表 Class<String>
    Collection<EmpInfo> emps=sqlUtility.select(EmpInfo.class, ”select * from emps”); 
    public static <T> Collection<T> select(Class<T> c, String sqlStatement) {
    Collection<T> result = new ArrayList<T>();
    /* run sql query using jdbc */
    for ( /* iterate over jdbc results */ ) {
    T item = c.newInstance();
    /* use reflection and set all of item’s fields from sql results */
    result.add(item);
    }
    return result;
    }

    以上的写法实际就是简化了select方法中关于实际类的创建的部分,至少保证了类必须存在,但是在方法和字段级别还是需要利用反射来解决.
  • 另外泛型的代码还支持&符号
  • public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

    相当于
    public static Comparable max(Collection coll)
    public static Object max(Collection coll)
    的并集
    

    [/list]
    之所以去研究了一下泛型是以为在看struts2中ioc框架的源码的过程中发现有很多泛型的内容看不懂所以特地研究了一下.
    看完了以后对于泛型总体感觉并没有说为开发带来多少便利,只是加强了对编译器类型的检查.
    分享到:
    评论

    相关推荐

      Java 第二阶段提升编程能力【泛型】---- 代码

      Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...

      JAVA-泛型课件-泛型课件

      泛型是Java语言的一个重要特性,首次出现在Java SE 1.5版本中。它的引入主要是为了解决在集合操作中类型安全性的问题,并通过引入参数化类型的概念,提高了代码的复用性与可读性。 ### 泛型概念 泛型,即参数化...

      很好的Java泛型的总结

      Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...

      Generic_2(泛型类-泛型方法-泛型接口-泛型限定(上限)

      泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...

      全面总结Java泛型--实例

      标题与描述均提到了“全面总结Java泛型--实例”,这表明文章旨在深入解析Java泛型的概念,并通过具体示例来展示其应用。Java泛型是Java编程语言的一个强大特性,它允许在编译时检查类型安全,并且所有的强制转换都是...

      关于java基础的泛型的练习

      Java泛型是Java SE 5.0引入的一个重要特性,它极大地增强了代码的类型安全性和可读性。泛型在编程中的应用广泛,特别是在集合框架中,使得我们可以在编译时就检查类型,避免了不必要的类型转换,并且提高了代码的...

      java-泛型-面试题.docx

      java-泛型-面试题.docx

      29-API-集合框架-泛型-使用_java_

      Java 泛型是Java编程语言中的一个重要特性,它在2004年随着...这个视频教程"29-API-集合框架-泛型-使用"应该会深入浅出地讲解这些概念,对于想要提升Java编程技能的初学者或有经验的开发者来说,都是很好的学习资源。

      补充知识:泛型1---马克-to-win java视频

      补充知识:泛型1---马克-to-win java视频的详细描述与介绍

      补充知识:泛型2---马克-to-win java视频

      补充知识2 ---马克-to-win java视频泛型的详细描述与介绍

      Java泛型研究.pdf

      虽然泛型可以提高Java语言的开发效率和安全性,但是泛型也需要注意一些问题: * 泛型擦除:Java编译器在编译时会擦除泛型信息,这意味着在运行时,泛型信息将被擦除。 * 类型参数的约束:泛型的类型参数需要遵守...

      Java泛型_Java中的泛型结构_

      Java泛型是Java编程语言中一个强大的特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。泛型的主要目标是提高代码的类型安全性和重用性,减少类型转换的麻烦,并在编译时捕获可能的类型错误。...

      JAVA泛型加减乘除

      这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

      java5泛型新特性 pdf

      Java 5 泛型是Java编程语言中一个重要的里程碑,它引入了类型安全的集合,大大增强了代码的可读性和可维护性。泛型在Java 5中首次亮相,为开发者提供了一种方式来限制集合(如List、Set、Map等)中可以存储的数据...

      java泛型技术之发展

      - **早期版本的局限**:在Java泛型出现之前,程序员通常使用Object作为容器类(如ArrayList、HashMap等)的默认类型,这导致了大量的类型转换操作,同时也容易引发ClassCastException。 - **类型擦除**:Java泛型...

      Java-泛型.ppt

      为了解决这些问题,Java 5引入了泛型这一特性。 **泛型**是一种参数化类型,它允许在类、接口和方法中使用类型参数,从而提高程序的重用性和类型安全性。泛型提供了一种在编译时检查类型安全性的机制,并且在运行时...

      java--泛型编程

      Java 泛型编程是Java语言在JDK 1.5版本引入的一项重要特性,它极大地提高了代码的安全性和可重用性。泛型本质上是参数化类型,允许我们在编写代码时,将数据类型作为参数,这使得类、接口和方法能够处理多种不同的...

    Global site tag (gtag.js) - Google Analytics