ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何访问数组的通用arraylist中的元素

2019-06-23 18:47:56  阅读:165  来源: 互联网

标签:java arrays arraylist generics


我一直在尝试访问数组列表中保存的几个数组的元素.我能够定期访问它,但问题出现在我使用泛型类型E来考虑不同的数据类型.这给了我一个类强制转换异常.如果我将tempStart和tempScan的类型以及相应的强制转换更改为int [](因为这是我用来传入的),它会运行.

public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
    if (list.get(0).getClass().isArray()) {
        System.out.println(" I am an array!");
        //go through the arrays and make sure they are 
        //not the same, remove any that are the same
        //make flag to see if something is different
        boolean matching;
        for (int idx = 0; idx < list.size() - 1; idx++) {
            E[] tempStart =(E[])list.get(idx);
            for (int k = idx + 1; k < list.size(); k++) {
                matching = true;
                E[] tempScan = (E[])list.get(k);
                for (int index = 0; index < tempStart.length; index++) {
                    if (tempStart[index] != tempScan[index]) {
                        matching = false;
                    }
                }
                if (matching) {
                    list.remove(tempScan);
                    k--;
                }
            }
        }

解决方法:

你试图将E转换为E [],这显然是不正确的.尝试类似的东西:

import java.lang.reflect.Array
...
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
    ArrayList<E> retList = new ArrayList<>(list.size());
    if (list.isEmpty()) return retList;
    if (list.get(0).getClass().isArray()) {
        boolean matching;
        for (int idx = 0; idx < list.size() - 1; ++idx) {
            E tempStart = list.get(idx);
            for (int k = idx + 1; k < list.size(); k++) {
                matching = true;
                E tempScan = list.get(k);
                int tempStartLen = Array.getLength(tempStart);
                for (int index = 0; index < tempStartLen; index++) {
                    if (Array.get(tempScan, index) != Array.get(tempStart, index)) {
                        matching = false;
                    }
                }
                if (matching) {
                    list.remove(tempScan);
                    k--;
                }
            }
        }
        return retList;
    } else {
        throw new IllegalArgumentException("List element type expected to be an array");
    }
}

但是因为我们使用Java Reflection Array来操作数组操作,所以使用泛型E在这里没有意义.您可以简单地将其声明为ArrayList< Object>

更新:如下面的@afsantos评论,参数类型ArrayList可以声明为ArrayList<?>因为什么都不会插入其中.

标签:java,arrays,arraylist,generics
来源: https://codeday.me/bug/20190623/1273662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有