• 王颖奇 20171010129《面向对象程序设计(java)》第十周学习总结


    实验十  泛型程序设计技术

    实验时间 2018-11-1

    1、实验目的与要求

    (1) 理解泛型概念;

    (2) 掌握泛型类的定义与使用;

    (3) 掌握泛型方法的声明与使用;

    (4) 掌握泛型接口的定义与实现;

    (5)了解泛型程序设计,理解其用途。

    2、实验内容和步骤

    实验1 导入第8章示例程序,测试程序并进行代码注释。

    测试程序1:

    编辑、调试、运行教材311312 代码,结合程序运行结果理解程序;

    在泛型类定义及使用代码处添加注释;

    掌握泛型类的定义及使用。 

    代码:

    package pair1;
    
    /**
     * @version 1.01 2012-01-26
     * @author Cay Horstmann
     */
    public class PairTest1
    {
       public static void main(String[] args)
       {
          String[] words = { "Mary", "had", "a", "little", "lamb" };
          Pair<String> mm = ArrayAlg.minmax(words);
          System.out.println("min = " + mm.getFirst());
          System.out.println("max = " + mm.getSecond());
       }
    }
    
    class ArrayAlg
    //泛型类
    {
       /**
        * Gets the minimum and maximum of an array of strings.
        * @param a an array of strings
        * @return a pair with the min and max value, or null if a is null or empty
        */
       public static Pair<String> minmax(String[] a)
    //使用泛型Pair类
       {
          if (a == null || a.length == 0) return null;
          String min = a[0];
          String max = a[0];
          for (int i = 1; i < a.length; i++)
          {
             if (min.compareTo(a[i]) > 0) min = a[i];
             if (max.compareTo(a[i]) < 0) max = a[i];
          }
          return new Pair<>(min, max);
       }
    }
    PairTest1
    package pair1;
    
    /**
     * @version 1.00 2004-05-10
     * @author Cay Horstmann
     */
    public class Pair<T> 
    //Pair类引入了一个类型变量T,用尖括号(<>)括起来,并放在类名的后面。
    {
       private T first;
       private T second;
    
       public Pair() { first = null; second = null; }
       public Pair(T first, T second) { this.first = first;  this.second = second; }
    
       public T getFirst() { return first; }
       public T getSecond() { return second; }
    
       public void setFirst(T newValue) { first = newValue; }
       public void setSecond(T newValue) { second = newValue; }
    }
    Pair

    运行结果:

    测试程序2:

    编辑、调试运行教材315 PairTest2,结合程序运行结果理解程序;

    在泛型程序设计代码处添加相关注释;

    掌握泛型方法、泛型变量限定的定义及用途。

    代码:

    package pair2;
    
    import java.time.*;
    
    /**
     * @version 1.02 2015-06-21
     * @author Cay Horstmann
     */
    public class PairTest2
    {
       public static void main(String[] args)
       {
          LocalDate[] birthdays = 
             { 
                LocalDate.of(1906, 12, 9), // G. Hopper
                LocalDate.of(1815, 12, 10), // A. Lovelace
                LocalDate.of(1903, 12, 3), // J. von Neumann
                LocalDate.of(1910, 6, 22), // K. Zuse
             };
          Pair<LocalDate> mm = ArrayAlg.minmax(birthdays);
          //在Pair中定义一个LocalDate类的birthdays数组
          System.out.println("min = " + mm.getFirst());
          System.out.println("max = " + mm.getSecond());
       }
    }
    
    class ArrayAlg
    //泛型类ArrayAlg
    {
       /**
          Gets the minimum and maximum of an array of objects of type T.
          @param a an array of objects of type T
          @return a pair with the min and max value, or null if a is 
          null or empty
       */
       public static <T extends Comparable> Pair<T> minmax(T[] a) 
       //使用extends关键字,定义泛型变量的上界,调用Comparable接口
       {
          if (a == null || a.length == 0) return null;
          T min = a[0];
          T max = a[0];
          for (int i = 1; i < a.length; i++)
          {
             if (min.compareTo(a[i]) > 0) min = a[i];
             if (max.compareTo(a[i]) < 0) max = a[i];
          }
          return new Pair<>(min, max);
       }
    }
    PairTest2
    package pair2;
    
    /**
     * @version 1.00 2004-05-10
     * @author Cay Horstmann
     */
    public class Pair<T> 
    {
       private T first;
       private T second;
    
       public Pair() { first = null; second = null; }
       public Pair(T first, T second) { this.first = first;  this.second = second; }
    
       public T getFirst() { return first; }
       public T getSecond() { return second; }
    
       public void setFirst(T newValue) { first = newValue; }
       public void setSecond(T newValue) { second = newValue; }
    }
    Pair

    运行结果:

    测试程序3:

    用调试运行教材335 PairTest3,结合程序运行结果理解程序;

    了解通配符类型的定义及用途

    代码:

    package pair3;
    
    /**
     * @version 1.01 2012-01-26
     * @author Cay Horstmann
     */
    public class PairTest3
    {
       public static void main(String[] args)
       {
          Manager ceo = new Manager("Gus Greedy", 800000, 2003, 12, 15);
          Manager cfo = new Manager("Sid Sneaky", 600000, 2003, 12, 15);
          Pair<Manager> buddies = new Pair<>(ceo, cfo);      
          printBuddies(buddies);
    
          ceo.setBonus(1000000);
          cfo.setBonus(500000);
          Manager[] managers = { ceo, cfo };
    
          Pair<Employee> result = new Pair<>();
          minmaxBonus(managers, result);
          System.out.println("first: " + result.getFirst().getName() 
             + ", second: " + result.getSecond().getName());
          maxminBonus(managers, result);
          System.out.println("first: " + result.getFirst().getName() 
             + ", second: " + result.getSecond().getName());
       }
    
       public static void printBuddies(Pair<? extends Employee> p)
       {
          Employee first = p.getFirst();
          Employee second = p.getSecond();
          System.out.println(first.getName() + " and " + second.getName() + " are buddies.");
       }
    
       public static void minmaxBonus(Manager[] a, Pair<? super Manager> result)
       {
          if (a.length == 0) return;
          Manager min = a[0];
          Manager max = a[0];
          for (int i = 1; i < a.length; i++)
          {
             if (min.getBonus() > a[i].getBonus()) min = a[i];
             if (max.getBonus() < a[i].getBonus()) max = a[i];
          }
          result.setFirst(min);
          result.setSecond(max);
       }
    
       public static void maxminBonus(Manager[] a, Pair<? super Manager> result)
       {
          minmaxBonus(a, result);
          PairAlg.swapHelper(result); // OK--swapHelper captures wildcard type
       }
       // Can't write public static <T super manager> ...
    }
    
    class PairAlg
    {
       public static boolean hasNulls(Pair<?> p)
       {
          return p.getFirst() == null || p.getSecond() == null;
       }
    
       public static void swap(Pair<?> p) { swapHelper(p); }
    
       public static <T> void swapHelper(Pair<T> p)
       {
          T t = p.getFirst();
          p.setFirst(p.getSecond());
          p.setSecond(t);
       }
    }
    PairTest3
    package pair3;
    
    /**
     * @version 1.00 2004-05-10
     * @author Cay Horstmann
     */
    public class Pair<T> 
    {
       private T first;
       private T second;
    
       public Pair() { first = null; second = null; }
       public Pair(T first, T second) { this.first = first;  this.second = second; }
    
       public T getFirst() { return first; }
       public T getSecond() { return second; }
    
       public void setFirst(T newValue) { first = newValue; }
       public void setSecond(T newValue) { second = newValue; }
    }
    Pair
    package pair3;
    
    import java.time.*;
    
    public class Employee
    {  
       private String name;
       private double salary;
       private LocalDate hireDay;
    
       public Employee(String name, double salary, int year, int month, int day)
       {
          this.name = name;
          this.salary = salary;
          hireDay = LocalDate.of(year, month, day);
       }
    
       public String getName()
       {
          return name;
       }
    
       public double getSalary()
       {  
          return salary;
       }
    
       public LocalDate getHireDay()
       {  
          return hireDay;
       }
    
       public void raiseSalary(double byPercent)
       {  
          double raise = salary * byPercent / 100;
          salary += raise;
       }
    }
    Employee
    package pair3;
    
    public class Manager extends Employee
    {  
       private double bonus;
    
       /**
          @param name the employee's name
          @param salary the salary
          @param year the hire year
          @param month the hire month
          @param day the hire day
       */
       public Manager(String name, double salary, int year, int month, int day)
       {  
          super(name, salary, year, month, day);
          bonus = 0;
       }
    
       public double getSalary()
       { 
          double baseSalary = super.getSalary();
          return baseSalary + bonus;
       }
    
       public void setBonus(double b)
       {  
          bonus = b;
       }
    
       public double getBonus()
       {  
          return bonus;
       }
    }
    Manager

    运行结果:

    实验2编程练习:

    编程练习1:实验九编程题总结

    l 实验九编程练习1总结(从程序总体结构说明、模块说明,目前程序设计存在的困难与问题三个方面阐述)。

    程序总体结构:

    主类Main和子类Student

    模块说明:

    Main

    1.文件读取模块

    2.根据实验要求,选择具体操作的模块

    3.对年龄数据进行相应的处理

    具体模块解释如下:

    package shen;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class Main {
        /**
         * 1.文件读取模块 利用ArrayList构造studentlist存放文件内容2. 创建文件字符流,分类读取文件内容 3.try/catch语句捕获异常
         */
        private static ArrayList<Student> studentlist;
    
        public static void main(String[] args) {
            studentlist = new ArrayList<>();
            Scanner scanner = new Scanner(System.in);
            File file = new File("C:\Users\ASUS\Desktop\新建文件夹\身份证号.txt");
            try {
                FileInputStream fis = new FileInputStream(file);
                BufferedReader in = new BufferedReader(new InputStreamReader(fis));
                String temp = null;
                while ((temp = in.readLine()) != null) {
    
                    Scanner linescanner = new Scanner(temp);
    
                    linescanner.useDelimiter(" ");
                    String name = linescanner.next();
                    String number = linescanner.next();
                    String sex = linescanner.next();
                    String age = linescanner.next();
                    String province = linescanner.nextLine();
                    Student student = new Student();
                    student.setName(name);
                    student.setnumber(number);
                    student.setsex(sex);
                    int a = Integer.parseInt(age);
                    student.setage(a);
                    student.setprovince(province);
                    studentlist.add(student);
    
                }
            } catch (FileNotFoundException e) {
                System.out.println("学生信息文件找不到");
                e.printStackTrace();
                // 加入的捕获异常代码
            } catch (IOException e) {
                System.out.println("学生信息文件读取错误");
                e.printStackTrace();
                // 加入的捕获异常代码
            }
            /*
             * 1.根据实验要求,选择具体操作的模块 2.利用switch语句选择具体的操作
             */
            boolean isTrue = true;
            while (isTrue) {
                System.out.println("选择你的操作,输入正确格式的选项");
                System.out.println("A.字典排序");
                System.out.println("B.输出年龄最大和年龄最小的人");
                System.out.println("C.寻找老乡");
                System.out.println("D.寻找年龄相近的人");
                System.out.println("F.退出");
                String m = scanner.next();
                switch (m) {
                case "A":
                    Collections.sort(studentlist);
                    System.out.println(studentlist.toString());
                    break;
                case "B":
                    int max = 0, min = 100;
                    int j, k1 = 0, k2 = 0;
                    for (int i = 1; i < studentlist.size(); i++) {
                        j = studentlist.get(i).getage();
                        if (j > max) {
                            max = j;
                            k1 = i;
                        }
                        if (j < min) {
                            min = j;
                            k2 = i;
                        }
    
                    }
                    System.out.println("年龄最大:" + studentlist.get(k1));
                    System.out.println("年龄最小:" + studentlist.get(k2));
                    break;
                case "C":
                    System.out.println("老家?");
                    String find = scanner.next();
                    String place = find.substring(0, 3);
                    for (int i = 0; i < studentlist.size(); i++) {
                        if (studentlist.get(i).getprovince().substring(1, 4).equals(place))
                            System.out.println("老乡" + studentlist.get(i));
                    }
                    break;
    
                case "D":
                    System.out.println("年龄:");
                    int yourage = scanner.nextInt();
                    int near = agenear(yourage);
                    int value = yourage - studentlist.get(near).getage();
                    System.out.println("" + studentlist.get(near));
                    break;
                case "F":
                    isTrue = false;
                    System.out.println("退出程序!");
                    break;
                default:
                    System.out.println("输入有误");
    
                }
            }
        }
    
        /*
         * 对年龄数据进行相应的处理
         */
        public static int agenear(int age) {
            int j = 0, min = 53, value = 0, k = 0;
            for (int i = 0; i < studentlist.size(); i++) {
                value = studentlist.get(i).getage() - age;
                if (value < 0)
                    value = -value;
                if (value < min) {
                    min = value;
                    k = i;
                }
            }
            return k;
        }
    
    }
    Main

    Student

    对数据进行具体处理的模块

    具体模块解释如下:

    package shen;
    
    /*
     * 分类返回具体数据
    *利用接口技术比较name的大小
    *用toString方法返回数据
     */
    public class Student implements Comparable<Student> {
    
        private String name;
        private String number;
        private String sex;
        private int age;
        private String province;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getnumber() {
            return number;
        }
    
        public void setnumber(String number) {
            this.number = number;
        }
    
        public String getsex() {
            return sex;
        }
    
        public void setsex(String sex) {
            this.sex = sex;
        }
    
        public int getage() {
    
            return age;
        }
    
        public void setage(int age) {
            // int a = Integer.parseInt(age);
            this.age = age;
        }
    
        public String getprovince() {
            return province;
        }
    
        public void setprovince(String province) {
            this.province = province;
        }
    
        public int compareTo(Student o) {
            return this.name.compareTo(o.getName());
        }
    
        public String toString() {
            return name + "	" + sex + "	" + age + "	" + number + "	" + province + "
    ";
        }
    }
    Student

    目前程序设计存在的困难与问题:

    路径设置不正确,无法读取身份证号.txt文件

    l 实验九编程练习2总结(从程序总体结构说明、模块说明,目前程序设计存在的困难与问题三个方面阐述)。

    程序总体结构说明:

    主类demo和子类yunsuan

    主类demo:main函数(主函数)

    子类yusuan:计算四则运算结果并将结果返回

    模块说明:

    demo:

    *文件输出模块

    *四则运算生成模块

    具体模块说明在代码中(如下):

    package demo;
    
    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    import java.util.Random;
    import java.util.Scanner;
    
    public class demo {
        public static void main(String[] args) {
    /**
    *文件输出模块
    *1.调用构造函数counter
    *2.创建文件字符流,将out中的内容设为空(null)
    *3.将out结果输出到test.txt中
    *4.try/catch模块捕获异常
    */
            Scanner in = new Scanner(System.in);
            yunsuan counter = new yunsuan();
            PrintWriter out = null;
            try {
                out = new PrintWriter("text.txt");
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    /**
    *四则运算生成模块
    *1.定义一个int型sum,计算成绩,并说明生成的运算类型
    *2.for语句,将{}内的内容循环10次,从而生成10道题目
    *3.随机生成int型a与b,范围在0到100以内;生成int型m,范围为1,2,3,4
    *4.利用switch语句,根据生成m的值,随机生成加减乘除四则运算
    *5.将循环结果输出到test.txt中
    */
            int sum = 0;
            System.out.println("随机生成的四则运算类型");
            System.out.println("类型1:除法");
            System.out.println("类型2:乘法");
            System.out.println("类型3:加法");
            System.out.println("类型4:减法");
            
            for (int i = 1; i <= 10; i++) {
                int a = (int) Math.round(Math.random() * 100);
                int b = (int) Math.round(Math.random() * 100);
                int m;
                Random rand = new Random();
                m = (int) rand.nextInt(4) + 1;
                System.out.println("随机生成的四则运算类型:"+m);
    
                switch (m) {
                case 1:
                    System.out.println(i + ": " + a + "/" + b + "=");
    
                    while (b == 0) {
                        b = (int) Math.round(Math.random() * 100);
                    }
    
                    double c0 = in.nextDouble();
                    out.println(a + "/" + b + "=" + c0);
                    if (c0 == counter.division(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
    
                    break;
    
                case 2:
                    System.out.println(i + ": " + a + "*" + b + "=");
                    int c = in.nextInt();
                    out.println(a + "*" + b + "=" + c);
                    if (c == counter.multiplication(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
                    break;
                case 3:
                    System.out.println(i + ": " + a + "+" + b + "=");
                    int c1 = in.nextInt();
                    out.println(a + "+" + b + "=" + c1);
                    if (c1 == counter.add(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
                    break;
                case 4:
                    System.out.println(i + ": " + a + "-" + b + "=");
                    int c2 = in.nextInt();
                    out.println(a + "-" + b + "=" + c2);
                    if (c2 == counter.reduce(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
                    break;
                }
            }
            System.out.println("成绩" + sum);
            out.println("成绩:" + sum);
            out.close();
        }
    }
    demo

     yunsuan:

    *四则运算计算模块

    package demo;
    
    public class yunsuan {
           private int a;
           private int b;
            public int add(int a,int b)
            {
                return a+b;
            }
            public int reduce(int a,int b)
            {
                return a-b;
            }
            public int multiplication(int a,int b)
            {
                return a*b;
            }
            public int division(int a,int b)
            {
                if(b!=0) 
                    return a/b;
                else 
                    return 0;            
            }
    
    }
    yunsuan

    目前程序设计存在的困难与问题:
    1.生成的除法式子无法整除(不符合小学生四则运算的知识范围),并且在输入正确结果后,无法输出正确语句。
    2.生成的减法式子,结果可能为负数(不符合小学生四则运算的知识范围)。
    3.曾经的思路无法将四则运算的式子输出到test.txt文档中。

    编程练习2:采用泛型程序设计技术改进实验九编程练习2,使之可处理实数四则运算,其他要求不变。

    更改思路:

    1.使用泛型技术进行改进

    2.对于无法整除(除不尽,不满足小学生四则运算的知识范围)的问题,可以设置条件,使随机生成的a,b的值能够满足整除(a>b,a%b==0,(a/b)%1==0)

    3.对于减法式子会出现结果为负数的问题(同上:不满足小学生四则运算的知识范围),可以设置条件,使随机生成的a>b

    具体代码如下:

    package demo;
    
    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    import java.util.Random;
    import java.util.Scanner;
    
    public class demo {
        public static void main(String[] args) {
    /**
    *文件输出模块
    *1.调用构造函数counter
    *2.创建文件字符流,将out中的内容设为空(null)
    *3.将out结果输出到test.txt中
    *4.try/catch模块捕获异常
    */
            Scanner in = new Scanner(System.in);
            yunsuan counter = new yunsuan();
            PrintWriter out = null;
            try {
                out = new PrintWriter("test.txt");
            } catch (FileNotFoundException e) {
                System.out.println("文件夹输出失败");
                e.printStackTrace();
            }
    /**
    *四则运算生成模块
    *1.定义一个int型sum,计算成绩,并说明生成的运算类型
    *2.for语句,将{}内的内容循环10次,从而生成10道题目
    *3.随机生成int型a与b,范围在0到100以内;生成int型m,范围为1,2,3,4
    *4.利用switch语句,根据生成m的值,随机生成加减乘除四则运算
    *5.将循环结果输出到test.txt中
    */
            int sum = 0;
            System.out.println("随机生成的四则运算类型");
            System.out.println("类型1:除法");
            System.out.println("类型2:乘法");
            System.out.println("类型3:加法");
            System.out.println("类型4:减法");
    
            for (int i = 1; i <= 10; i++) {
                int a = (int) Math.round(Math.random() * 100);
                int b = (int) Math.round(Math.random() * 100);
                int m;
                Random rand = new Random();
                m = (int) rand.nextInt(4) + 1;
                System.out.println("随机生成的四则运算类型:" + m);
    
                switch (m) {
                case 1:
                    a = b + (int) Math.round(Math.random() * 100);
                    while(b == 0){
                        b = (int) Math.round(Math.random() * 100);
                    }
                    while(a % b != 0){
                        a = (int) Math.round(Math.random() * 100);
                        
                    }
                                    //若生成的除法式子必须能整除,且满足分母为0的条件,则a一定要大于b,且a模b的结果要为0。
                    System.out.println(i + ": " + a + "/" + b + "=");
    
                    int c0 = in.nextInt();
                    out.println(a + "/" + b + "=" + c0);
                    if (c0 == counter.division(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
    
                    break;
    
                case 2:
                    System.out.println(i + ": " + a + "*" + b + "=");
                    int c = in.nextInt();
                    out.println(a + "*" + b + "=" + c);
                    if (c == counter.multiplication(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
                    break;
                case 3:
                    System.out.println(i + ": " + a + "+" + b + "=");
                    int c1 = in.nextInt();
                    out.println(a + "+" + b + "=" + c1);
                    if (c1 == counter.add(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
                    break;
                case 4:
                    while (a < b) {
                        b = (int) Math.round(Math.random() * 100);
                    }
                                    //因为不能产生运算结果为负数的减法式子,所以a一定要大于b。若a<b,则重新生成b。
                    System.out.println(i + ": " + a + "-" + b + "=");
                    int c2 = in.nextInt();
                    out.println(a + "-" + b + "=" + c2);
                    if (c2 == counter.reduce(a, b)) {
                        sum += 10;
                        System.out.println("right!");
                    } else {
                        System.out.println("error!");
                    }
                    break;
                }
            }
            System.out.println("成绩" + sum);
            out.println("成绩:" + sum);
            out.close();
        }
    }
    demo
    package demo;
    
    public class yunsuan<T> {
        private T a;
        private T b;
    
        public yunsuan() {
            a = null;
            b = null;
        }
        public yunsuan(T a, T b) {
            this.a = a;
            this.b = b;
        }
              
        public int add(int a,int b) {
            return a + b;
        }
    
        public int reduce(int a, int b) {
            return a - b;
        }
    
        public int multiplication(int a, int b) {
            return a * b;
        }
    
        public int division(int a, int b) {
            if (b != 0 && a%b==0)
                return a / b;
            else
                return 0;
        }
    }
    yunsuan

    运行结果:

     

    学习总结:

    泛型程序设计(技术):

    泛型:也称参数化类型(parameterized type),就是在定义类、接口和方法时,通过类型参数指示将要处理的对象类型。(如ArrayList类)

    泛型程序设计(Generic programming):编写代码可以被很多不同类型的对象所重用。

    泛型类的定义:

    一个泛型类(generic class)就是具有一个或多个类型变量的类,即创建用类型作为参数的类。

    小结:

    1.某类引入了一个类型变量T,用尖括号(<>)括起来,并放在类名的后面。

    2.类定义中的类型变量用于指定方法的返回类型以及域、局部变量的类型。

    泛型方法的声明:

     泛型方法:

    – 除了泛型类外,还可以只单独定义一个方法作为泛型方法,用于指定方法参数或者返回值为泛型类型,留待方法调用时确

    – 泛型方法可以声明在泛型类中,也可以声明在普通类

    泛型接口的定义

    泛型变量的限定:

    1.定义泛型变量的上界

    extends关键字所声明的上界既可以是一个类,也可以是一个接口

    2.定义泛型变量的下界

    – 通过使用super关键字可以固定泛型参数的类型为某种类型或者其超类

    – 当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符

    泛型类的约束与局限性(*

    不能用基本类型实例化类型参数
    运行时类型查询只适用于原始类型
    不能抛出也不能捕获泛型类实例
    参数化类型的数组不合法
    不能实例化类型变量
    泛型类的静态上下文中类型变量无效注意擦除后的

    泛型类型的继承规则(*)

    Java中的数组是协变的(covariant)。

    通配符类型

    通配符

    – “?”符号表明参数的类型可以是任何一种类型,它和参数T的含义是有区别的。T表示一种未知类型,而“?”表示任何一种类型。这种通配符一般有以下三种用法:

    – 单独的?,用于表示任何类型。
    – ? extends type,表示带有上界。
    – ? super type,表示带有下界。

    学习小结

    通过这个周的学习,我了解了泛型设计技术的概念,以及好处和限制,基本上会运用泛型技术设计程序,但是在通配符的运用方面仍然不太懂,望老师能够再次讲解。

  • 相关阅读:
    js少写if语句
    框架大集合
    new运算符工作原理(new运算符的伪码实现)
    原始数据类型和引用数据类型
    关于input 的选中,自定义input[type="checkbox"]样式
    css伪类与伪元素
    js 的function为什么可以添加属性
    工具,如何去掉百度编辑器 ueditor 元素路径、字数统计等
    多种框架好库的混合使用
    js预编译的四部曲
  • 原文地址:https://www.cnblogs.com/1556889081wyq/p/9895750.html
Copyright © 2020-2023  润新知