zoukankan      html  css  js  c++  java
  • EffectiveJava(24)使用@SuppressWarnings("unchecked")消除非受检警告

    …..使用泛型编程时,会遇到许多编译器警告,如:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,费受精转换警告.这次的内容就是遇到这些警告的时候你该怎么办.
    PS:非受检警告就是代码上黄色的感叹号
    1.首先,要尽可能地通过泛型控制消除每一个非受检警告.这意味着你将不会在运行时出现ClassCastException异常
    2.如果无法消除警告,同时可以证明引起警告的代码类型是安全的,可以用一个@SuppressWarnings(“unchecked”)注解来禁止这条警告.但它只是给你一个错误的安全感.
    2.a.@SuppressWarnings虽然可以用在任何粒度的级别中,但我们应该始终在尽可能小的范围中使用SuppressWarnings注解,即使会因此多创建一个变量.并且,永远不要在类上使用它
    如:ArrayList类当中的toArray方法

        public <T> T[] toArray(T[] a){
                    if(a.length < size)
                        return (T[])Arrays.copyOf(elements,size,a.getClass());
                    System.arraycopy(elements,0,a,0,size);
                    if(a.length > size)
                        a[size] = null;
                    return a;
                }
        当编译它时,我们会受到一条unchecked cast警告,我们可以通过加注解取消这条编译警告(不要直接在return上加)
    
        @SuppressWarning("unchecked")
                T[] result = (T[])Arrays.copyOf(elements,size,a.getClass());
                    System.arraycopy(elements,0,a,0,size);
                return result;
        注意,每当你使用@SuppressWarning("unchecked")注解消除警告时,都要添加一条注释,说明为什么这么做是安全的.
    

    总结:即使有非受检警告可以运行程序,它们也非常重要.每条警告都可能在运行时抛出ClassCastException异常.要尽最大的努力消除这些警告.如果无法消除警告,同时可以证明引起警告的代码类型是安全的,可以用一个@SuppressWarnings(“unchecked”)注解来禁止这条警告.
    同时,注解消除警告时,都要添加一条注释,说明为什么这么做是安全的.

  • 相关阅读:
    RocketMQ延迟消息的代码实战及原理分析
    如何做技术选型?Sentinel 还是 Hystrix?
    什么是服务熔断?
    降级-熔断-限流-傻傻分不清楚
    java-分布式-降级 熔断 限流
    java-分布式-分布式事务
    常用限流算法的应用场景和实现原理
    使用Redis作为分布式锁的一些注意点
    ansible {{}}引用变量,变量中嵌套变量如何表示
    shell获得java进程号跟进程对应的线程号
  • 原文地址:https://www.cnblogs.com/qwop/p/6637285.html
Copyright © 2011-2022 走看看