我不断收到错误消息: 注意: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);
}
}
提前谢谢!
答案 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;
}