zoukankan      html  css  js  c++  java
  • 泛型与数组

    泛型与数组

    泛型数组的创建

    • 可以声明带泛型的数组引用,但是不能直接创建带泛型的数组对象

    ArrayList[] listArr = new ArrayList<>[5]; //会报错

    原因:假如我们可以声明这样一个泛型数组(实际上是不可以的):
    List[] stringLists = new List[10];
    由于在 Java 中,数组是协变(covariant)的,这意味着基类类型的数组可以接收子类类型的数组,例如:
    Object[] objects = stringLists;
    一旦我们这样做之后,就可以通过objects向 stringLists中添加非List类型的数据。
    随后,再使用 stringList 时,stringList[0] 就会保存 intList, 而使用下面的代码,编译器不会提示错误,但运行时,就会出错。
    String str = stringList[0].get(0);

    即使创建出来“泛型数组”以上错误也依然存在。

    List[] stringLists = (List[])new List[10];
    Object[] objects = stringLists;
    List intList = Arrays.asList(1);
    objects[0] = intList;
    String str = stringLists[0].get(0); //runtime error

    package com.genericity.demo7;
    
    import java.util.ArrayList;
    
    public class Test1 {
        public static void main(String[] args) {
    //        ArrayList<String>[] listArr = new ArrayList<>[5]; //会报错
            //以下这种写法也是会报错的:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    //        ArrayList[] list = new ArrayList[5];
    //        ArrayList<String>[] listArr = list;
    //
    //        ArrayList<Integer> intList = new ArrayList<>();
    //        intList.add(100);
    //
    //        list[0] = intList;
    //        String s = listArr[0].get(0);
    //        System.out.println(s);
    
    //        那么我们应该怎样使用呢?
            ArrayList<String>[] strArrList = new ArrayList[5];
            //ArrayList<Integer> intList = new ArrayList<>();
            //strArrList[0]=intList;//会编译出错:Incompatible types.
            ArrayList<String> strList = new ArrayList<>();
            strList.add("aaa");
            strArrList[0]=strList;//这样使用才是正确的
            System.out.println(strArrList[0].get(0));
        }
    }
    
    
    • 可以通过java.lang.reflect.Array的newInstance(Class,int)创建T[]数组
    package com.genericity.demo7;
    
    import com.zyqtest.Aa;
    
    import java.lang.reflect.Array;
    
    public class Fruit<T> {
        //申明一个泛型数组
        private T[] array;
    
        /**
         *
         * @param clz Class对象
         * @param length 数组的长度
         */
        public Fruit(Class<T> clz,int length){
           //通过Array.newInstance创建泛型数组
            array = (T[]) Array.newInstance(clz,length);
        }
    
        /**
         * 填充数组
         * @param index 数组的下标
         * @param item 元素-值
         */
        public void put(int index,T item){
            array[index]=item;
        }
    
        /**
         * 获取数组元素
         * @param index
         * @return
         */
        public T get(int index){
            return array[index];
        }
    
        /**
         * 获取泛型数组
         * @return
         */
        public T[] getArray(){
            return array;
        }
    
    }
    
    
    package com.genericity.demo7;
    
    import java.util.Arrays;
    
    public class Test2 {
        public static void main(String[] args) {
            Fruit<String> fruit = new Fruit<>(String.class,3);
            fruit.put(0,"苹果");
            fruit.put(1,"西瓜");
            fruit.put(2,"香蕉");
            System.out.println(Arrays.toString(fruit.getArray()));
            System.out.println(fruit.get(1));
        }
    }
    /**
     * 运行结果:
     * [苹果, 西瓜, 香蕉]
     * 西瓜
     */
    
    
  • 相关阅读:
    转:线程Thread (1)
    jquery 比较全面的API中文版地址
    IE 出现stack overflow 报错的原因归纳
    转:C#常用的集合类型(ArrayList类、Stack类、Queue类、Hashtable类、Sort)
    转:双向链表dblinklist
    转:stack
    转:queue
    解决获取同胞元素空白节点影响的问题
    取10到100的随机数方法
    进度条
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/15662559.html
Copyright © 2011-2022 走看看