在声明具有模糊类型(比如:泛型)的可变参数的构造函数或方法时,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的使用

@SafeVarargs注解的使用的更多相关文章

  1. @SafeVarargs注解

    被@SafeVarargs注解标注的方法必须是由static或者final修饰的方法. 使用泛型的变长参数方法产生编译器警告的示例: public static <T> T useVara ...

  2. Java基础教程(16)--注解

    一.注解基础知识 1.注解的格式   最简单的注解就像下面这样: @Entity   @符号指示编译器其后面的内容是注解.在下面的例子中,注解的名称为Override: @Override void ...

  3. 每个 Java 开发者都应该知道的 5 个注解

    自 JDK5 推出以来,注解已成为Java生态系统不可缺少的一部分.虽然开发者为Java框架(例如Spring的@Autowired)开发了无数的自定义注解,但编译器认可的一些注解非常重要. 在本文中 ...

  4. Java-注解(不包含元注解)

    @SuppressWarnings:抑制警告 package java.lang; import java.lang.annotation.*; import static java.lang.ann ...

  5. 夯实Java基础(十七)——注解(Annotation)

    1.注解概述 从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation).其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 “@Overr ...

  6. java注解使用总结

    2005年,sun公司推出了jdk1.5,同时推出的注解功能吸引了很多人的目光,使用注解编写代码,能够减轻java程序员繁琐配置的痛苦. 使用注解可以编写出更加易于维护,bug更少的代码. 注解是什么 ...

  7. SafeVarargs的用法

    转载自:http://softlab.sdut.edu.cn/blog/subaochen/2017/04/safevarargs%E7%9A%84%E7%94%A8%E6%B3%95/ @SafeV ...

  8. Java7新特性

    ① 新增了switch对字符串的支持,也就是说可以在switch之后直接使用字符串来进行判断,语法基本与Java7之前支持的语法一样. ② 对数值字面量的增强支持,首先是可以在源代码中直接使用二进制数 ...

  9. Java设计和实现方法

    方法签名 方法名是驼峰命名 方法名最好能说明该方法主要做什么 方法参数的名字最好能说明该参数的意义 方法参数个数最好低于6个 例如: public void setTitleVisible(int l ...

  10. Java 9 揭秘(20. JDK 9中API层次的改变)

    Tips 做一个终身学习的人. 在最后一章内容中,主要介绍以下内容: 下划线作为新关键字 改进使用try-with-resources块的语法 如何在匿名类中使用<>操作符 如何在接口中使 ...

随机推荐

  1. 使用Electron-builder将web项目封装客户端安装包 发布

    背景:之前用electron-packager将web项目打包成客户端时,exe文件只能在当前文件夹下运行,如果发送给别人使用 极不方便.所以我们可以用electron-builder将web项目封装 ...

  2. http-server 服务配置跨域

    http-server --cors -p 9999 http-server --cors -p 9999 -c-1 (禁用缓存)

  3. C++的一些随笔(第一篇)

    C++中 ->的作用 ->用于指针 ->用于指向结构体的指针 ->用于指向结构体的指针,表示结构体内的元素  #include<stdio.h> struct ro ...

  4. 排队论——系统运行指标的R语言实现

    排队是在日常生活中经常遇到的现象,如顾客到商店购买物品.病人到医院看病常常要排队.此时要求服务的数量超过服务机构(服务台.服务员等)的容量.也就是说,到达的顾客不能立即得到服务,因而出现了排队现象.这 ...

  5. [VMware]虚拟网络编辑器

    虚拟网络编辑器 Vmware > 编辑 > 虚拟网络编辑器 VMnet0 VMnet0:用于虚拟桥接模式网络下的虚拟交换机 vmnet0: 实际上就是一个虚拟的网桥 这个网桥有很若干个端口 ...

  6. AF_XDP技术简介

    本文分享自天翼云开发者社区@<AF_XDP技术简介>,作者: l****n 一.概述 AF_XDP 是一项新增的,针对高性能数据包处理进行优化的地址族协议.本文档假设读者已经熟悉 BPF ...

  7. Redis 数据类型 Set

    Redis 数据类型 Set(集合) Redis 常用命令,思维导图 >>> Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复 ...

  8. [Pytorch框架] 2.1.4 数据的加载和预处理

    文章目录 PyTorch 基础 :数据的加载和预处理 Dataset Dataloader torchvision 包 torchvision.datasets torchvision.models ...

  9. sqlilabs第一关

    首先打开网页,进行注入点的测试 输入?id=1 and 1=1发现1=2的时候没有进行报错,有两种可能,一种是不能注入,第二种是字符型可以通过对字符型里面的''进行闭合,输入'and 1=1--+发现 ...

  10. Python3.10动态修改Windows系统(win10/win11)本地IP地址(静态IP)

    一般情况下,局域网里的终端比如本地服务器设置静态IP的好处是可以有效减少网络连接时间,原因是过程中省略了每次联网后从DHCP服务器获取IP地址的流程,缺点是容易引发IP地址的冲突,当然,还有操作层面的 ...