如何使用Java中的对象列表创建ensureCapacity方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (46)

所以,我正在创建一个名为“Sack”的通用数据结构。在这里我添加项目到一个麻袋,抓取一个随机项目,看它是否为空,或倾倒其内容等。另外我正在创建它以扩展以根据需要保存尽可能多的项目。

我目前正在研究一个ensureCapacity方法,它应该确保麻袋具有其参数值的容量,如果没有,则为麻袋创建一个新的基础数据结构,其数量是当前容量的两倍多。

我已经尝试了很多这样做的方法,但我一直收到错误。我会删除我的大部分代码,还有我试过的两种方法,并指出我收到的错误。

public class Sack<E>
{
 public static final int DEFAULT_CAPACITY = 10;
 private E [] elementData;
 private int size;

@SuppressWarnings("unchecked")
   public Sack()
   {
     elementData = (E[]) new Object[DEFAULT_CAPACITY];
   }
@SuppressWarnings("unchecked")
public Sack(int capacity)
{
    if(capacity < 0)
    {
        throw new IllegalArgumentException("capacity " + capacity);
    }
    this.elementData = (E[]) new Object[capacity];
}

public boolean isEmpty()
{
    if(size == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
 public E [] dump()
 {
   E [] E2 = Arrays.copyOf(elementData, size);
   for(int i = 0; i < size; i++)
   {
      elementData[i] = null;

   }
   size = 0;
    return E2;
}

第一个:在这个错误中,主要是当我运行测试时说修改器不正确并且它是预期的:2,而实际:1。

public void ensureCapacity(int capacity)
{
    capacity = elementData.length * 2;
    elementData = Arrays.copyOf(elementData, capacity);
}

第二:

public void ensureCapacity(int capacity)
{

    if(capacity > elementData.length)
    {
        int newCapacity = elementData.length * 2 +1;
        if(capacity > newCapacity)
        {
            newCapacity = capacity;
        }
        E [] newList = new E[newCapacity]; //Error occurs here under E stating Type parameter 'E' cannot be instantiated directly. 
        for(int i = 0; i < size; i++)
        {
            newList[i] = elementData[i];
        }
        elementData = newList;
    }
}

不确定这意味着什么,但如果你们有任何解决方法,请告诉我。这会有很大帮助。

我也有一个添加方法和删除方法,但那些是不正确的,所以当我解决这个问题时,我应该解决这些问题。

提问于
用户回答回答于

你因为“擦除”而得到了这个错误 - 即。泛型类型仅用于编译时,但是从编译的字节码中“擦除”。这意味着运行时不知道“E”表示哪种类型,因此无法创建任何泛型类型的实例(也不是数组)。(另请参阅什么是擦除)。

因此,您可以替换该错误行来创建一个Object数组,就像您已经完成的那样:

E [] newList = (E[]) new Object[DEFAULT_CAPACITY];

但这并不理想 - 更好的是直接创建正确类型的数组。这样做的解决方法是修改构造函数以获取实际运行时类型Class的参数(我喜欢调用此参数“clazz”),因此您可以将该引用保持为方便 - 所以:

private Class<E> clazz;

@SuppressWarnings("unchecked")
public Sack(Class<E> clazz, int capacity)
{
    if(capacity < 0)
    {
        throw new IllegalArgumentException("capacity " + capacity);
    }
    this.clazz = clazz;
    this.elementData = (E[]) Array.newInstance(this.clazz, capacity);
}

当然用以下代码替换该错误行:

E [] newList = (E[]) Array.newInstance(this.clazz, capacity);

扫码关注云+社区

领取腾讯云代金券