Lambda
表达式是迄今为止 Java 8 讨论和推广最多的特性。我赞成 Lambda
是一个很大的改进,可是我认为其余一些 Java 8 特性因为 Lambda
而显得有点暗淡。在这篇文章中,我想展现另外一个很好的 Java 8 特性的一些例子:类型注解html
类型注解是一种能够放在任何使用类型的位置上的注释(注:在 Java 8 以前的版本中,只能在声明式前使用注解)。这包括 new
运算符,类型转换, implements
子句和 throws
子句。类型注解增强了分析Java代码的能力,并可以确保更强大的类型检查。java
在代码实现上,Java 8为注解增长了两个新的注解类型:框架
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface Test {
}
复制代码
TYPE_PARAMETER
容许注解被用在类型变量(注:即泛型)的声明中(好比 MyClass<@Test T>
)。 TYPE_USE
容许注解能够被用在任何类型使用的地方。函数
请注意,在 Java 8 中,如下示例中的注解没有实际做用。Java 8 仅提供定义这些类型的注释的功能,而后由框架和工具开发者来实际上使用它们。因此这是一个未来框架会提供给咱们的一个注解集合。如下大多数示例都来自 Type Annotations 规范和各类 Java 8 演示文稿。工具
带有类型注解的简单类型定义以下所示:spa
@NotNull String str1 = ...
@Email String str2 = ...
@NotNull @NotBlank String str3 = ...
复制代码
类型注解也能够用于嵌套类型code
Map.@NonNull Entry = ...
复制代码
用于构造函数htm
new @Interned MyObject()
new @NonEmpty @Readonly List<String>(myNonEmptyStringSet)
myObject.new @Readonly NestedClass()
复制代码
类型转换继承
myString = (@NonNull String) myObject;
query = (@Untainted String) str;
复制代码
继承ci
class UnmodifiableList<T> implements @Readonly List<T> { ... }
复制代码
泛型
List<@Email String> emails = ...
List<@ReadOnly @Localized Message> messages = ...
Graph<@Directional Node> directedGraph = ...
Map<@NonNull String, @NonEmpty List<@Readonly Document>> documents;
复制代码
包括参数边界和通配符边界
class Folder<F extends @Existing File> { ... }
Collection<? super @Existing File> c = ...
List<@Immutable ? extends Comparable<T>> unchangeable = ...
复制代码
抛出异常
void monitorTemperature() throws @Critical TemperatureException { ... }
void authenticate() throws @Fatal @Logged AccessDeniedException { ... }
复制代码
instanceof
语句
boolean isNonNull = myString instanceof @NonNull String;
boolean isNonBlankEmail = myString instanceof @NotBlank @Email String;
复制代码
以及最后 Java 8 的方法引用
@Vernal Date::getDay
List<@English String>::size
Arrays::<@NonNegative Integer>sort
复制代码
类型注解是 Java 类型系统的一个有趣的补充。它们能够应用于任何类型的使用,并启用更详细的代码分析。若是您如今要使用类型注解,您应该查看 Checker Framework。