@SafeVarargs注解的使用


在聲明具有模糊類型(比如:泛型)的可變參數的構造函數或方法時,Java編譯器會報unchecked警告。鑒於這些情況,如果程序員斷定聲明的構造函數和方法的主體不會對其varargs參數執行潛在的不安全的操作,可使用@SafeVarargs進行標記,這樣的話,Java編譯器就不會報unchecked警告。

先看看@SafeVarargs在Java SE中的聲明:

package java.lang;

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
public @interface SafeVarargs {}

由Java源代碼聲明我們了解到:@SafeVarargs注解,只能用於標記構造函數和方法,由於保留策略聲明為RUNTIME,所以此注解可以在運行時生效。

使用的時候要注意:@SafeVarargs注解,對於非static或非final聲明的方法,不適用,會編譯不通過。

@SafeVarargs使用示例如下:

package org.springmorning.demo.javabase.annotation.pre;

/**
 * @author 春晨
 * @date 2019/1/19 9:26
 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10285780.html
 */
public class SafeVarargsAnnotation<S>{

    private S[] args;

    //構造函數可以使用@SafeVarargs標記
    @SafeVarargs
    public SafeVarargsAnnotation(S... args){
        this.args = args;
    }

    //此處不能使用@SafeVarargs,因為此方法未聲明為static或final方法,如果要抑制unchecked警告,可以使用@SuppressWarnings注解
    @SuppressWarnings("unchecked")
    //@SafeVarargs
    public void loopPrintArgs(S... args){
        for (S arg : args) {
            System.out.println(arg);
        }
    }

    //final方法可以使用@SafeVarargs標記
    @SafeVarargs
    public final void printSelfArgs(S... args){
        for (S arg : this.args) {
            System.out.println(arg);
        }
    }

    public static void main(String[] args) {
        SafeVarargsAnnotation.loopPrintInfo("A", "B", "C");
    }

    //static方法可以使用@SafeVarargs標記
    @SafeVarargs
    public static <T> void loopPrintInfo(T ... infos){
        for (T info : infos) {
            System.out.println(info);
        }
    }

}

如果以上把@SafeVarargs標記注釋掉,在編譯時就會報unchecked警告:

加上@SafeVarargs注解,警告被抑制:

下節繼續

    下節將給大家講解預定義注解@FunctionalInterface的使用

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM