使用未经检查或不安全的操作

时间:2013-05-17 21:04:30

标签: java arraylist compiler-errors

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

我用谷歌搜索并发现this帖子,并做了我认为会删除错误的更改,但我继续得到错误。

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

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);
}
}

提前谢谢!

2 个答案:

答案 0 :(得分: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那样:< / p>

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

作为一个例外,惯例是对泛型类型使用单个大写字母;当我独立查看<Item>时,您使用toArray首先欺骗了我。

答案 1 :(得分:-3)

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

public Item[] toArray(){
    Item[] temp = bag.toArray(new Item[0]);
    return temp;
}
相关问题