为什么不简单地禁用未经检查的警告?

Jen*_*ann 10 java generics unchecked

当开发人员与非通用API交互时,他们通常会遇到"未经检查"的警告.请考虑以下示例:

import java.util.AbstractList;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class IterableNodeList<T extends Node> extends AbstractList<T>
{
    private NodeList list;

    public IterableNodeList(NodeList list)
    {
        this.list = list;
    }

    public T get(int index)
    {
        return (T)this.list.item(index);
    }

    public int size()
    {
        return this.list.getLength();
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,人们可以投入努力以这样的方式编写它,即没有警告:T在类和构造函数参数上使用类型参数Class<T>,匹配成员变量和cast()调用.

或者,可以考虑简单地编辑IDE配置和构建脚本(例如Maven POM)以完全禁用此编译器警告.现在,如果我们这样做,代码可以保持原样,但我确信做必须有缺点.但是,我想不出任何合理,现实的例子

  • 这个警告提供的价值超过"坚持在@SuppressWarnings这里,无论如何没有其他选择",以及在哪里
  • 生成的代码实际上与我们忽略(禁用)警告的代码不同(并且更安全).

你能想到这样的例子或者说出为什么在全球范围内禁用这些"未经检查"的警告是个坏主意的另一个原因吗?或者这实际上是个好主意?

UPDATE

之前的例子实际上没有引发警告.现在有些答案不再有意义了.抱歉给你带来不便.

And*_*niy 5

据Item 24的Effective Java 2nd Edition,广泛使用频繁的@SupressWarnings是一般坏主意,特别是如果你申请这个注释向全班同学,因为这样的警告,告诉你可能是个危险的代码,这可能会导致ClassCastException.

但在某些情况下,它可能是有用的,例如在ArrayList的toArray方法实现:

@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
    if (a.length < size)
        // Make a new array of a's runtime type, but my contents:
        return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}
Run Code Online (Sandbox Code Playgroud)