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

  • 相关阅读:
    模仿outlook快捷方式栏的一个控件
    买了一本书《Programming pearls》编程珠玑(88上的数学题目(1))
    一个IE动画图标的小例子
    对水波特效实现原理的解释
    向量空间的几何变换
    一个简单Led控件
    【转载】配置(visual studio.net已检测到指定的web服务器运行的不是asp.net1.1版)
    最近学习ASP2.0相关的几个小问题(非创新性文章)
    一道c的面试题,大数相乘。
    Led控件(2)——Led显示屏模拟
  • 原文地址:https://www.cnblogs.com/minguo/p/10576060.html
Copyright © 2011-2022 走看看