zoukankan      html  css  js  c++  java
  • 为什么要有泛型?

    泛型出现的动机在于: 
    有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。

    容器类应该算得上最具重用性的类库之一。先来看一个没有泛型的情况下的容器类如何定义:

    public class Container {
        private String key;
        private String value;
    
        public Container(String k, String v) {
            key = k;
            value = v;
        }
    
        public String getKey() {
            return key;
        }
    
        public void setKey(String key) {
            this.key = key;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }

    Container类保存了一对key-value键值对,但是类型是定死的,也就说如果我想要创建一个键值对是String-Integer类型的,当前这个Container是做不到的,必须再自定义。那么这明显重用性就非常低。

    当然,我可以用Object来代替String,并且在Java SE5之前,我们也只能这么做,由于Object是所有类型的基类,所以可以直接转型。但是这样灵活性还是不够,因为还是指定类型了,只不过这次指定的类型层级更高而已,有没有可能不指定类型?有没有可能在运行时才知道具体的类型是什么?

    所以,就出现了泛型。

    public class Container<K, V> {
        private K key;
        private V value;
    
        public Container(K k, V v) {
            key = k;
            value = v;
        }
    
        public K getKey() {
            return key;
        }
    
        public void setKey(K key) {
            this.key = key;
        }
    
        public V getValue() {
            return value;
        }
    
        public void setValue(V value) {
            this.value = value;
        }
    }

    在编译期,是无法知道K和V具体是什么类型,只有在运行时才会真正根据类型来构造和分配内存。可以看一下现在Container类对于不同类型的支持情况:

    public class Main {
    
        public static void main(String[] args) {
           Container<String, String> c1 = new Container<String, String>("电影名", "天下无贼");
            Container<String, Integer> c2 = new Container<String, Integer>("票房", 3);
            Container<Double, Double> c3 = new Container<Double, Double>(2.2, 2.2);
            System.out.println(c1.getKey() + " : " + c1.getValue());
            System.out.println(c2.getKey() + " : " + c2.getValue());
            System.out.println(c3.getKey() + " : " + c3.getValue());
        }
    }

    相关链接:

             https://segmentfault.com/a/1190000002646193 

             https://www.cnblogs.com/lwbqqyumidi/p/3837629.html

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/inbeijing/p/11647015.html
Copyright © 2011-2022 走看看