泛型与数组

泛型与数组

泛型数组的创建

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

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));
    }
}
/**
 * 运行结果:
 * [苹果, 西瓜, 香蕉]
 * 西瓜
 */

posted on   ~码铃薯~  阅读(310)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2019-12-08 mybatis框架-resultMap的自动映射级别-partial 和full的探讨
2019-12-08 mybatis框架-使用resultMap实现高级结果映射,collection属性的使用
2019-12-08 mybatis框架-使用resultMap实现高级结果映射,association属性
2019-12-08 前端知识--mulline框架,返回到前一个页面,并且刷新前一个页面

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示