zoukankan      html  css  js  c++  java
  • Java基础:泛型

      同样是面试当中遇到的问题,在平常写代码的过程当中,经常有使用到泛型编程,比如用到的各种集合方式,如Arraylist、hashmap、List、等,都有使用到泛型。但是当面试官让自己系统的介绍一下泛型编程的时候,自己也突然懵逼了,自己所理解的所谓泛型,就是在声明容器变量的时候,将类型当做参数声明进来,对于泛型的其他特性和好处,自己都没有很系统的了解,特此在此系统的总结一下,java当哈总很重要的一个部分,就是泛型编程。

      在java没有增加泛型类之前,泛型程序的设计是通过继承来实现的,即比如Arraylist来说,其只维护了一个Object引用的数组,当存入其他类型的时候,则通过强值类型转化进行,这样会出现问题,且先看下面的代码:

     public class Test {
     
         public static void main(String[] args) {
             List list = new ArrayList();
             list.add("qqyumidi");
             list.add("corn");
             list.add(100);
     
             for (int i = 0; i < list.size(); i++) {
                 String name = (String) list.get(i); // 1
                 System.out.println("name:" + name);
             }
         }
     }

      在代碼當中,list变量由于维护的是一个object的数据,而object类型是所有类型的父类,所有可以往该list存入任何类型的实例,在代码中就存入了两个String类型和一个Integer类型的实例,而这样就会导致在读取数组当中的变量的时候,无法提前预知数据当中存入的究竟是什么类型的变量,导致出现强制类型转换异常,比如在例子当中,就会出现读取到第三个Integer型变量的时候,报错。这就是没有泛型类之前,java所面临的问题,只有在程序员自己的脑子里预先定好哪一个类是存储什么类型的变量的容器,而不能体现在代码当中,导致代码的安全性和可读性不高。

      为了解决这个问题,java提出了泛型类的概念,泛型,即“参数化类型”。即如同声明方法的时候需要声明参数的类型,在声明泛型变量的时候,也需要将类型当中变量声明进去,将原来的类型编程了参数的形式,在声明的过程当中声明进去。可以看下面的例子:

    public class test {
    
        public static void main(String[] args) {
            /*
            List list = new ArrayList();
            list.add("qqyumidi");
            list.add("corn");
            list.add(100);
            */
    
            List<String> list = new ArrayList<String>();
            list.add("qqyumidi");
            list.add("corn");
            //list.add(100);   // 1  提示编译错误
    
            for (int i = 0; i < list.size(); i++) {
                String name = list.get(i); // 2
                System.out.println("name:" + name);
            }
        }
    }

    在这个例子当中List在声明的时候,将String当做参数声明进了list变量当中,那么该list就是一个被声明只能存String类型的list了,而这时候还想要往list插入Integer型,则编译器就会检查报错。这样无疑是增加了代码的可读性和安全性。这是从泛型类的一个方面上来看泛型的好处。

      那么从泛型类的使用者的角度来看泛型好处,那么就是一个容器类,使用泛型之后,可以增加代码的重用性,而不需要为每一种变量去编写特定的容器类,比如String类型,去编写一个只能存储String类型的容器,而Integer类型,又只能再去编写一个只能存储Integer类型的容器类,在使用泛型的过程中,我们只需要用<>的形式,将要存储的类型参数化的传入就可以只需要编写一个容器类的代码,而可以将这个容器类用于转载各种类型的实例,这就是从另一方面来看泛型的好处。下面简单的上一个自定义泛型编程的代码:

    class Box<T> {
    
        private T data;
    
        public Box() {
    
        }
    
        public Box(T data) {
            setData(data);
        }
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    
    }
  • 相关阅读:
    【leetcode】1020. Partition Array Into Three Parts With Equal Sum
    【leetcode】572. Subtree of Another Tree
    【leetcode】123. Best Time to Buy and Sell Stock III
    【leetcode】309. Best Time to Buy and Sell Stock with Cooldown
    【leetcode】714. Best Time to Buy and Sell Stock with Transaction Fee
    【leetcode】467. Unique Substrings in Wraparound String
    【leetcode】823. Binary Trees With Factors
    【leetcode】143. Reorder List
    【leetcode】1014. Capacity To Ship Packages Within D Days
    【leetcode】1013. Pairs of Songs With Total Durations Divisible by 60
  • 原文地址:https://www.cnblogs.com/WellHold/p/7364975.html
Copyright © 2011-2022 走看看