微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

当开发人员与非通用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();
    }
}

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

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

>这个警告提供的价值比“坚持在这里的@SuppressWarnings,没有别的选择”,而在哪里
>所得到的代码实际上与我们忽略(禁用)警告的行为不同(和更安全).

你能想到这样的例子,还是指出在全球禁用这些“未经检查”的警告的另一个原因是一个坏主意?还是其实是个好主意?

UPDATE

以前的例子实际上并没有引起警告.一些答案现在不再有道理了.抱歉给你带来不便.

解决方法

根据有效Java第2版的第24项,广泛而频繁地使用@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,a,size);
    if (a.length > size)
        a[size] = null;
    return a;
}

原文地址:https://www.jb51.cc/java/123778.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐