zoukankan      html  css  js  c++  java
  • 泛型集合和泛型类,方法,高级特征详解

    package com.list.demo.entity;
    
    public class Student implements Comparable<Student> {
        
        private Integer id;
        
        
        
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Student() {
            
        }
        
        public Student(int id) {
            this.id = id;
        }
    
        @Override
        public String toString() {
            return "Student [id=" + id + "]";
        }
    
        @Override
        public int compareTo(Student o) {
            return this.getId() - o.getId();
        }
        
        
    
    }
    package com.list.demo;
    
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    import com.list.demo.entity.Student;
    
    public class ListDemo {
        
        public static void main(String[] args) {
            // 只能存储带String类的元素
            // 数组: 基本数据类型和对象类都是可以的
            // 集合: 元素必须是对象类型
            // 泛型检测是编译阶段(类型擦除)
            List<Integer> list = new ArrayList<Integer>();
            list.add(1111);
            list.add(2222);
            list.add(4444);
            
            // 绕过编译检测
            Class<?> clazz = list.getClass();
            try {
                Method method = clazz.getDeclaredMethod("add", Object.class);
                method.invoke(list, "aaa");
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            System.out.println(list);
            
            for (Object value : list) {
                System.out.println(value);
            }
            
            
            Set<Student> studentSet = new HashSet<Student>();
            studentSet.add(new Student());
            studentSet.add(new Student());
            
            System.out.println(studentSet);
            
            ////////////// Map /////////////////
            Map<String,Student> stuMap = new HashMap<String,Student>();
            stuMap.put("1001", new Student());
            stuMap.put("1002", new Student());
            stuMap.put("1003", new Student());
            stuMap.put("1004", new Student());
            
            
            for (Map.Entry<String, Student> entry : stuMap.entrySet()) {
                String key = entry.getKey();
                Student value = entry.getValue();
                System.out.println(key+"----"+value);
            }
            System.out.println("---------------------------------");
            
            
            // 局部内部类
            class MyComparator implements Comparator<String> {
    
                @Override
                public int compare(String o1, String o2) {
                    return -o2.hashCode() + o1.hashCode();
                }
                
            }
            
            ///////////////////// 排序的Map->对象key进行排序 ///////////////
            // Map<String,Student> treeMap = new TreeMap<>(new MyComparator());
            Map<String,Student> treeMap = new TreeMap<>(new Comparator<String>() {
    
                @Override
                public int compare(String o1, String o2) {
                    return -o2.hashCode() + o1.hashCode();
                }
            });
            
            treeMap.put("1001A", new Student(1001));
            treeMap.put("1aAa", new Student(1002));
            treeMap.put("AAA", new Student(1000));
            treeMap.put("1004B", new Student(1003));
            
            for (Map.Entry<String, Student> entry : treeMap.entrySet()) {
                String key = entry.getKey();
                Student value = entry.getValue();
                System.out.println(key+"----"+value);
            }
            
            /**
             * 
             */
            Function fun = new Function() {
                
                @Override
                public void add() {
                    System.out.println("调用了Add方法");
                    
                }
            };
            
            fun.add();
        }
        
    }
    
    
    interface Function {
        void add();
    }
    泛型
    package com.generic.demo;
    
    public interface GenericInterface<T> {
        void add(T t);
    }
    package com.generic.demo;
    
    /**
     * 
     * @author Administrator
     *
     */
    public class GenericClass implements GenericInterface<Teacher> {
        public static void main(String[] args) {
            BaseDAO<Student> dao = new BaseDAO<Student>();
            dao.add(new Student());
            
            BaseDAO<Book> bookDao = new BaseDAO<Book>();
            bookDao.add(new Book());
            
            BaseDAO<Teacher> teaDao = new BaseDAO<Teacher>();
            teaDao.add(new Teacher());
            // 调用泛型方法
            String row = teaDao.get(11F, "AAA");
            String row1 = teaDao.<Double, String, Student>get(11D, "AAA");        
            System.out.println(row);
            
        }
    
        @Override
        public void add(Teacher t) {
            // TODO Auto-generated method stub
            
        }
    }
    
    /**
     * 泛型类
     * T 对象
     * E 元素
     * V value
     * K key
     */
    class BaseDAO<T> {
        void add(T t) {
            System.out.println("我添加了:"+t);
        }
        
        /**
         * 泛型方法
         * @param e
         * @return
         * <E> 声明泛型类型
         */
        public <E,X,K> X get(E e, X x) {
            System.out.println(e+"--"+x);
            return x;
        }
    }
    
    class Student {
        
    }
    
    class Teacher {
        
    }
    
    class Book {
        
    }

    泛型绑定接口的测试

    package com.generic.demo.supers.interfacess;
    
    public interface IBaseDAO {
        void query();
    }
    
    class UserDAO implements IBaseDAO {
    
        @Override
        public void query() {
            // TODO Auto-generated method stub
            
        }
        
    }
    
    class BookDAO implements IBaseDAO {
    
        @Override
        public void query() {
            // TODO Auto-generated method stub
            
        }
        
    }
    
    class TeacherDAO implements IBaseDAO {
    
        @Override
        public void query() {
            // TODO Auto-generated method stub
            
        }
        
    }
    
    class Student {
        
    }
    package com.generic.demo.supers.interfacess;
    
    /**
     * 泛型绑定接口的测试
     * @author Administrator
     *
     */
    public class Genderic1 {
        public static void main(String[] args) {
            print(new UserDAO());
            print(new BookDAO(),new TeacherDAO());
            print(new IBaseDAO[]{new TeacherDAO(),new TeacherDAO(),new TeacherDAO(),new TeacherDAO()});
            // print(new Student());  //Student 不是IBaseDao的实现类
            
        }
        
        // <T extends IBaseDAO> T泛型类绑定了一个范围
        // 可变参数数组: 要求只能放在参数列表中的最后一个位置
        public static <T extends IBaseDAO> void print(T... t) {
            System.out.println(t.length);
        }
    }

    泛型绑定类的测试

    package com.generic.demo.supers.types;
    
    import java.io.Serializable;
    
    public class Animal {
    
    }
    
    class Lion extends Animal {
        
    }
    
    class Tiger extends Animal implements Serializable {
        
    }
    
    class Mouse extends Animal implements Serializable {
        
    }
    
    class Grass implements Serializable {
        
    }
    package com.generic.demo.supers.types;
    
    import java.io.Serializable;
    
    /**
     * 泛型绑定类的测试
     * @author Administrator
     *
     */
    public class TestBindType {
        
        public static void main(String[] args) {
            printSingle(new Animal());
            printSingle(new Tiger());
            printMulti(new Tiger());
            printMulti(new Mouse());
            // printMulti(new Grass()); // Grass不是Animal子类
            
            
            
        }
        
        // 绑定了类型: 绑定类必须为Animal及其子类
        public static <T extends Animal> void printSingle(T t) {
            System.out.println(t);
        }
        
        // 绑定了多个类型: 绑定类必须为Animal及其子类,还必须实现Serializable
        public static <T extends Animal&Serializable> void printMulti(T t) {
            System.out.println(t);
        }
    }

    通配符

    package com.generic.demo.supers.common;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 通配符
     * ? 无边界
     * ? extends 上边界
     * ? super   下边界 (用的非常少)
     * @author Administrator
     *
     */
    public class TestCommon {
        public static void main(String[] args) {
            // ? 问号统配
            Point<?> point = new Point<Integer>(222, 33);
            point = new Point<Integer>(111, 11);
            point = new Point<Double>(33D, 33D);
            point = new Point<String>("111", "AAAA");
            
            // ? extends限定上限: 能读但是不能存 (找本身及其子类)
            Point<? extends Number> p = new Point<Long>(11L,33L);
            p = new Point<Float>(11.1F,33.2F);
            p = new Point<Integer>(11,33);
            p = new Point<Number>(11,23);
            // p = new Point<String>("111","22"); String 不是Number子类
            System.out.println(p.getX());
            // p.setX(new Long(1));
            
            //? super 限定下限 找本身及父类
            List<? super Manager> list = new ArrayList<Employee>(); 
            
            /**
             * 通配符?总结
             ? extends 和 t ? super 通配符的特征,我们可以得出以下结论:
              ◆ 如果你想从一个数据类型里获取数据,使用 ? extends 通配符(能取不能存)
              ◆ 如果你想把对象写入一个数据结构里,使用 ? super 通配符
              ◆ 如果你既想存,又想取,那就别用通配符
             */
            
            
        }
    }
    
    class Point<X> {
        
        private X x;
        
        public X getX() {
            return x;
        }
    
        public void setX(X x) {
            this.x = x;
        }
    
        public Point(X x, X y) {
            this.x = x;
        }
    }
    
    class CEO extends Manager {  
    }
    
     
    class Manager extends Employee {  
    }
    
      
    class Employee {  
    }  
  • 相关阅读:
    我和计算机
    十四周学习记录
    十五周个人作业
    怎样成为一个高手
    C语言第0次作业
    C语言博客作业03函数
    C博客作业01分支、顺序结构
    C语言博客作业02循环结构
    Rails后台,Firefox Addons前端,JS的AJAX调用
    Ruby 三元一次线性方程组
  • 原文地址:https://www.cnblogs.com/sunBinary/p/10492779.html
Copyright © 2011-2022 走看看