3

我不断收到一条错误消息:注意:ABag.java 使用未经检查或不安全的操作。

我用谷歌搜索并找到了这篇文章,并进行了我认为可以消除错误的更改,但我继续收到错误。

我还能做些什么来停止收到此错误消息吗?

public class ABag<Item> implements BagInterface<Item>
{
private ArrayList<Item> bag;

//creates an empty bag
public ABag(){
    bag = new ArrayList<Item>();
}

//creates an empty set with initial capacity
public ABag (int initialCapacity){
    bag = new ArrayList<Item>(initialCapacity);
}


public boolean add(Item newEntry){
    if (newEntry == null)
        return false;
    else
    {
        bag.add(newEntry);
        return true;
    }
}


public boolean isFull(){
    return false;
}


public Item[] toArray(){
    Item[] temp = (Item[])bag.toArray();
    return temp;
}


public boolean isEmpty(){
    return false;
}


public int getCurrentSize(){
    return bag.size();
}


public int getFrequencyOf(Item anEntry){
    int count = 0;
    if (!(bag.contains(anEntry)))
    {
        for (int i=0;i<bag.size();i++)
        {
            if (bag.get(i) == anEntry)
                count++;
        }
    }
    return count;
}


public boolean contains(Item anEntry){
    return bag.contains(anEntry);
}


public void clear(){
    bag.clear();
}


public Item remove(){
    int size = bag.size();
    Item removed = bag.remove(size-1);
    return removed;
}


public boolean remove(Item anEntry){
    return bag.remove(anEntry);
}
}

先感谢您!

4

2 回答 2

3

您应该启用 linting 以获取有关特定问题的详细警告:

javac -Xlint:all ...

除其他外,toArray()已损坏。该List.toArray()方法返回一个 Object[],而不是 的数组<T>,因此您的转换(Item[])为不正确,将在运行时失败。你应该使用<T> T[] toArray(T[] a).

为了创建泛型类型的数组(可能是 Java 泛型的最大弱点),您需要传入目标类型的 Class 并使用反射并抑制警告,如下所示:

static public <T> T[] create(Class<T> typ, int len) {
    return uncheckedCast(java.lang.reflect.Array.newInstance(typ,len));
}

@SuppressWarnings("unchecked")
static public <T> T uncheckedCast(final Object obj) {
    return (T)obj;
}

另一种选择是将问题推回到可以假定知道正确类型的代码的一层,并将该类型的数组传递给您的toArray方法,就像 Collections API 所做的那样:

public Item[] toArray(Item[] dummy) {
    return this.bag.toArray(dummy);
}

顺便说一句,惯例是对泛型类型使用单个大写字母;当我孤立地<Item>看时,你的使用首先愚弄了我。toArray

于 2013-05-17T21:11:01.283 回答
-3

用这个替换你的 toArray,以避免演员

public Item[] toArray(){
    Item[] temp = bag.toArray(new Item[0]);
    return temp;
}
于 2013-05-17T21:13:50.413 回答