• Java 泛型


    泛型类型必须是引用类型。不能用int、double或char等基本数据类型来替换泛型类型

    1、定义泛型类和接口

    例子:

    public class TestStack<E> {
        
        private ArrayList<E> list = new ArrayList();
        
        public TestStack() {
            // TODO Auto-generated constructor stub
        }
        
        public int getSize() {
            return list.size();
        }
        
        public E peek() {
            E e = list.get(getSize() - 1);
            return e;
        }
        
        public E pop() {
            E e = peek();
            list.remove(getSize() - 1);
            return e;
        }
        
        public void push(E e) {
            list.add(e);
        }
        
        
        public boolean isEmpty() {
            return list.isEmpty();
        }
        
        public String toString() {
            return "stack: " + list.toString();
        }
        
        public static void main(String [] args) {
            TestStack<String> stack1 = new TestStack<>();
            stack1.push("London");
            stack1.push("Pairs");
            stack1.push("Berlin");
            System.out.println(stack1.toString());
            stack1.pop();
            System.out.println(stack1.toString());
        }
    }

    2、泛型方法

    要声明方法的泛型类型,请为方法返回类型放置泛型类型,例如<E> void max(E o1,E o2)

    3、对一个对象数组进行排序

    例子:

    public class GenericSort1 {
        public static void main(String [] args) {
            
            Integer [] intArray = {new Integer(2),new Integer(4),new Integer(3),new Integer(1)};
            
            Double [] doublesArrray = {new Double(3.4),new Double(1.3),new Double(-22.1)};
            
            String [] stringArray = {"zzzzz","ddddd","qqweasd"};
            
            
            printlist(intArray);
            sort(intArray);
            printlist(intArray);
            
            printlist(doublesArrray);
            sort(doublesArrray);
            printlist(doublesArrray);
            
            printlist(stringArray);    
            sort(stringArray);
            printlist(stringArray);    
        
        }
    
        public static <E extends Comparable<E>> void sort(E [] list) { //E是Comparable的子类型,其次还指定进行比较的元素是E类型
            E currentMin;
            int currentMinIndex;
            for(int i=0; i<list.length - 1; i++) {
                currentMin = list[i];
                currentMinIndex = i;
                for(int j=i+1; j<list.length; j++) {
                    if(currentMin.compareTo(list[j]) > 0) {
                        currentMin = list[j];
                        currentMinIndex = j;
                    }
                }
                if(currentMinIndex != i) {
                    list[currentMinIndex] = list[i];
                    list[i] = currentMin;
                }
            }
        }
        
        public static <E> void printlist(E [] list) {
            for(int i=0; i<list.length; i++) {
                System.out.print(list[i] + " ");
            }
            System.out.println();
        }
    }

    4、通配类型

    通配类型有三种形式:

    1、?  (非受限通配   跟 ? extends Object 一样)

    2、? extends T (受限通配  表示T或T的一个子类型) 

    3、? super T   (下限通配 表示T或T的一个父类型)

    5、消除泛型和对泛型的限制

    泛型是使用一种称为类型消除的方法来实现的。

    泛型存在编译时。一旦编译器确认泛型类型是安全使用的,就会将他转换为原始类型。

    例子:

    编译器会先检查a代码里泛型是否正确使用,然后将它翻译成b

    6、泛型的限制

    1、不能使用new E()

    不能使用泛型类型参数创建实例。列如:

    E object = new E(); 错误

    2、不能使用new E  [ ]

    不能使用泛型类型参数创建数组。列如:

    E [ ] elements = new E[capcacity];

    但可以通过创建一个Object类型的数组,然后将它的类型转换为E[ ] 来规避这个限制。 例如:

    E [ ] elements = (E[ ]) new Object[dapcacity];

    3、在静态上下文中不允许的参数是泛型类型

    4、异常类不能是泛型的

  • 相关阅读:
    codeforces 616B Dinner with Emma
    codeforces 616A Comparing Two Long Integers
    codeforces 615C Running Track
    codeforces 612C Replace To Make Regular Bracket Sequence
    codeforces 612B HDD is Outdated Technology
    重写父类中的成员属性
    子类继承父类
    访问修饰符
    方法的参数
    实例化类
  • 原文地址:https://www.cnblogs.com/zquan/p/9354721.html
Copyright © 2020-2023  润新知