【问题标题】:Problem with incompatible types while trying to remove element from custom generic array尝试从自定义泛型数组中删除元素时出现不兼容类型的问题
【发布时间】:2020-03-06 22:27:58
【问题描述】:

我想制作自己的 ArrayList 表示。

在我的班级MyList<T> 我正在创建T[] array= (T[]) new Object[size];

在尝试删除元素时,我必须创建另一个数组来比较元素,

所以我发了T[] tmpArr=(T[])array;

我想重写除一个之外的所有元素,我想删除它但我有错误

当我尝试array[i]=tmpArr[i+1]array= tmpArray 时,任何转换都不起作用,我该怎么做? 错误在 else if 和 else 中

public void remove() {
        T[] tmpArray= (T[]) new Object[realSize];
        for(int i=0;i<size;++i){
            tmpArray[i]=(T)array[i];
        }
        for(int i=0;i<size;++i) {
            if (i == current - 1) {

            } else if (i > current - 1) {
                array[i] =tmpArray[i + 1];
            } else {
                array[i] = (T) tmpArray[i];
            }
        }

    }

【问题讨论】:

  • 这个问题需要更多细节。请考虑创建minimal reproducible example。如果有任何帮助,您可以查看standard library's ArrayList source,看看它是如何处理删除的。
  • 基本上我正在创建两个数组 T[] arr=(T[]) new Object[size],我不能做类似 arr[i]=tmpArr[i+1] 或 arr=tmpArr
  • 尽量避免在 cmets 中添加细节和解释。对于那些想要回答你的问题的人来说,这会让事情变得更难。相反,请编辑您的问题并根据需要添加代码/详细信息/解释。
  • “我必须创建另一个数组来比较元素,所以我创建了T[] tmpArr=(T[])array;”,它不会创建另一个数组(作为一个单独的对象占用不同的内存位置),而只是另一个 变量 将持有与array 相同的引用。此外,您的示例应该可以正常编译,除非您在通用方法中执行它们,该方法定义了自己的 separate 类型,该类型与在MyList&lt;T&gt; 指定的&lt;T&gt; 无关。
  • 无论如何要得到正确的答案,我们需要看到正确的minimal reproducible example(我们可以将代码复制粘贴到我们的计算机中并且无需任何修改重现您遇到的问题)。

标签: java arrays generics


【解决方案1】:

这行不通,因为new Object[int] 不会创建T[],所以它不能被强制转换为一个。那么你能做什么呢?只需使用 Object[] 而不是 T[]

public class ArrayList<T>
    private Object[] array = new Object[0];

    public void remove() {
        array = Arrays.copyOf(array, array.length - 1);
    }

    // Ensures only T objects are place inside Object[] array.
    public void add(T object) {
        array = Arrays.copyOf(array, array.length + 1);
        array[array.length - 1] = object;
    }

    // Actually save, because only T objects can be place inside Object[] array
    public T get(int index) {
        @SuppressWarnings("unchecked")
        T obj = (T) array[index];
        return obj;
    }
}

不要只是复制这个。这只是一个示例,每次大小更改(通过添加或删除)时都会创建一个新数组,这是非常低效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多