zoukankan      html  css  js  c++  java
  • Java学习之——泛型

    1.概要

    generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods.

    泛型能在定义类,接口和方法时将类型(类和接口)作为参数。和方法声明时的形式参数很类似,都是为了在不同的输入时重用相同的代码。不同的是
    形式参数输入的是而泛型是类型

    2.为什么使用泛型

    1.编译时更加强的(Stronger)类型检测
    java编译器对泛型代码进行强类型检测,一旦检测到代码违反类型安全就发出类型错误。
    修复编译错误要比运行错误容易,因为运行错误很难找到问题所在。

    2.不用类型转换

           //没有使用泛型
            List list = new ArrayList();
            list.add("without generics");
            //需要强制类型转换
            String s1 = (String) list.get(0);
            
            //使用泛型
            List<String> list2 = new ArrayList<String>();
            list2.add("generics");
            String s2 = list2.get(0);//不需要转换
    

    3.使程序员能实现适用更加普遍的算法

    通过使用泛型,使程序员能实现普遍的算法,算法将是能使用于不同类型的,能自定义的,类型安全的,易读的。

    如只写一个排序方法,就能够对整形数组、字符串数组甚至支持排序的任何类型的数组进行排序。

    3.具体使用

    1.泛型(generic type)

    A generic type is a generic class or interface that is parameterized over types.

    泛型是一种通用的类或接口,通过类型参数化的。

    泛型类以下面的格式定义:

    class name<T1, T2, ..., Tn> { /* ... */ }
    

    通过Box类的非泛型版和泛型版来学习一下:

    非泛型:

    //non-generic class
    public class Box {
        private Object object;
    
        public Object getObject() {
            return object;
        }
    
        public void setObject(Object object) {
            this.object = object;
        }
    }
    
    

    泛型:

    //generic class
    public class Box<T> {
    
        //T表示Type
        private T t;
    
        public T getT() {
            return t;
        }
    
        public void setT(T t) {
            this.t = t;
        }
    
    }
    
    

    类型参数命名规范
    按约定的习俗,类型参数的名字都是由一个大写字母构成。

    E - Element 元素(used extensively by the Java Collections Framework)
    K - Key 键
    N - Number 数值
    T - Type 类型
    V - Value 值
    S,U,V etc. - 2nd, 3rd, 4th types 第二种,第三种,第四种类型

    调用和实例化泛型类

    为了获得泛型类的引用,必须执行泛型类的调用,使用具体的值来代替T,如Integer。

    //获得引用
    Box<Integer> integerBox;
    //实例化
    integerBox = new Box<Integer>();
    

    泛型类的调用类似于普通的方法调用,只是泛型类传递的是类型参数(type argument)而方法调用传递的是参数(argument)。

    多类型参数

    泛型类可能有多种类型的参数。如下所示:

    public interface Pair<K,V>{
        public K getKey();
        public V getValue();
    }
    public class OrderedPair<K,V> implements Pair<K,V>{
        private K key;
        private V value;
        public OrderedPair(K key,V value){
            this.key = key;
            this.value = value;
        }
        @Override
        public K getKey() {
            return key;
        }
    
        @Override
        public V getValue() {
            return value;
        }
    }
    //实例化
    Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8);
    Pair<String, String>  p2 = new OrderedPair<String, String>("hello", "world");
    //Java SE7开始出现的新语法
    OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);
    OrderedPair<String, String>  p2 = new OrderedPair<>("hello", "world");
    //参数化的类型
    OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...));
    
  • 相关阅读:
    编程浪子我的个人知识树
    JAVA基本数据类型
    JS导出数据为表格-csv
    table表格打印样式
    ENTER键指定事件
    legend生成表单边框效果
    js按拼音排序算法
    CommonJs规范
    iscroll在安卓高版本(6.0以上)某些机型上滑动卡顿问题的解决方法
    前端常见报错原因详解
  • 原文地址:https://www.cnblogs.com/JohnTsai/p/4596566.html
Copyright © 2011-2022 走看看