# 类型注解和可插入类型系统

> 原文： [https://docs.oracle.com/javase/tutorial/java/annotations/type_annotations.html](https://docs.oracle.com/javase/tutorial/java/annotations/type_annotations.html)

在 Java SE 8 发行版之前，注解只能应用于声明。从 Java SE 8 发布版开始，注解也可以应用于任何 _ 类型 _。这意味着可以在使用类型的任何位置使用注解。使用 where 类型的几个示例是类实例创建表达式（`new`），强制转换，`implements`子句和`throws`子句。这种注解形式称为 _ 类型注解 _，[注解基础知识](basics.html)中提供了几个示例。

创建类型注解是为了支持改进的 Java 程序分析，以确保更强的类型检查。 Java SE 8 版本不提供类型检查框架，但它允许您编写（或下载）类型检查框架，该框架实现为与 Java 编译器结合使用的一个或多个可插入模块。

例如，您希望确保程序中的特定变量永远不会分配给 null;你想避免触发`NullPointerException`。您可以编写自定义插件来检查此问题。然后，您将修改代码以注解该特定变量，表明它永远不会分配给 null。变量声明可能如下所示：

```
@NonNull String str;

```

当您编译代码（包括命令行中的`NonNull`模块）时，编译器会在检测到潜在问题时输出警告，允许您修改代码以避免错误。在更正代码以删除所有警告后，程序运行时不会发生此特定错误。

您可以使用多个类型检查模块，其中每个模块检查不同类型的错误。通过这种方式，您可以构建在 Java 类型系统之上，在您希望的时间和地点添加特定的检查。

通过明智地使用类型注解和可插入类型检查器的存在，您可以编写更强大且更不容易出错的代码。

在许多情况下，您不必编写自己的类型检查模块。有第三方为您完成了这项工作。例如，您可能希望利用华盛顿大学创建的 Checker Framework。该框架包括`NonNull`模块，正则表达式模块和互斥锁模块。有关更多信息，请参阅 [Checker Framework](http://types.cs.washington.edu/checker-framework/) 。