zoukankan      html  css  js  c++  java
  • Java泛型相关总结(上)

    最近在看《Java核心技术》泛型相关的部分,总结下。

    泛型程序设计是什么?

    泛型编程(generic programming)是计算机编程中的一种风格,类型通过参数指定。意味着编写的代码可以被不同类型的对象所使用。

    类型参数(type parameters),指示类型。ArrayList用类型参数来指示包含元素的类型。使程序有更好的可读性和安全性。

    解决什么问题?

    使代码具有更好的可读性和安全性。

    如何用

    泛型类(generic class)具有一个或多个类型参数的类。如下所示,用具体的类型替换类型变量就可以实例化类型参数,Pair<String>。

     1 public class Pair<T> {
     2     private T first;
     3     private T second;
     4 
     5     public Pair() {
     6         first = null;
     7         second = null;
     8     }
     9 
    10     public Pair(T first, T second) {
    11         this.first = first;
    12         this.second = second;
    13     }
    14 
    15     public T getFirst() {
    16         return first;
    17     }
    18 
    19     public void setFirst(T first) {
    20         this.first = first;
    21     }
    22 }

    泛型方法(generic method)。泛型方法可以定义在普通类中,也可以定义到泛型类中。

    在普通类定义泛型方法

    class ArrayAlg {
        public static <T> T getMiddle(T... a) {
            return a[a.length/2];
        }
    }

    调用泛型方法,<String>大部分情况下可不写。

    ArrayAlg.<String>getMiddle("John", "Q", "Public");

    对于编译器无法确定参数类型会给出错误报告,如下所示。编译器会将参数打包成1个Double,2个Integer,并寻找其共同的超类,且找到两个Number和Comparable,会报错。

    ArrayAlg.getMiddle(3.14, 1729, 0);

    对类或方法的类型变量加以限定。

    class ArrayAlg {
        public static <T extends Comparable> T min(T... a) {
        }
    }

    可以有多个限定,用&连接,但限定中至多有一个类,且必须是限定列表中的第一个。

    T extends Comparable & Serializable

    虚拟机没有泛型类型对象,所有对象都属于普通类。编译器会擦除(erased)类型变量,并替换为限定类型(如果没有限定类型,使用Object),使之成为原始类型(raw type)。Pair<T>的原始类型如下:

    public class Pair {
        private Object first;
        private Object second;
    }

    关于Java泛型转换的事实:
    虚拟机中没有泛型,只有普通的类和方法
    所有的类型参数都用它们的限定类型替换
    桥方法被合成来保持多态
    为保持类型安全性,必要时插入强制类型转换

  • 相关阅读:
    BZOJ 3208: 花神的秒题计划Ⅰ
    BZOJ 3207: 花神的嘲讽计划Ⅰ
    BZOJ 2732: [HNOI2012]射箭
    BZOJ 3165: [Heoi2013]Segment
    BZOJ 3626: [LNOI2014]LCA
    2017 01 16 校内小测 ZXR专场
    BZOJ 3101: N皇后
    BZOJ 1106: [POI2007]立方体大作战tet
    BZOJ 2084: [Poi2010]Antisymmetry
    【UOJ#228】基础数据结构练习题 线段树
  • 原文地址:https://www.cnblogs.com/minguo/p/10576060.html
Copyright © 2011-2022 走看看