Home » Java » Core Java » Java 8 Type Annotations

About Michael Scharhag

Michael Scharhag
Michael Scharhag is a Java Developer, Blogger and technology enthusiast. Particularly interested in Java related technologies including Java EE, Spring, Groovy and Grails.

Java 8 Type Annotations

Lambda expressions are by far the most discussed and promoted feature of Java 8. While I agree that Lambdas are a large improvement I think that some other Java 8 feature go a bit short because of the Lambda hype. In this post I want to show a number of examples from another nice Java 8 feature: Type Annotations.

Type Annotations are annotations that can be placed anywhere you use a type. This includes the new operator, type casts, implements clauses and throws clauses. Type Annotations allow improved analysis of Java code and can ensure even stronger type checking.

In source code this means we get two new ElementTypes for annotations:

@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface Test {
}

The enum value TYPE_PARAMETER allows an annotation to be applied at type variables (e.g. MyClass<T>). Annotations with target TYPE_USE can be applied at any type use.

Please note that the annotations from the following examples will not work out of the box when Java 8 is released. Java 8 only provides the ability to define these types of annotations. It is then up to framework and tool developers to actually make use of it. So this is a collection of annotations frameworks could give us in the future. Most of the examples are taken from the Type Annotations specification and various Java 8 presentations.

Simple type definitions with type annotations look like this:

@NotNull String str1 = ...
@Email String str2 = ...
@[email protected]= ...

Type annotations can also be applied to nested types

Map.@NonNull Entry = ...

Constructors with type annotations:

[email protected]()
[email protected]@Readonly List<String>(myNonEmptyStringSet)

They work with nested (non static) class constructors too:

[email protected]()

Type casts:

myString = (@NonNull String) myObject;
query = (@Untainted String) str;

Inheritance:

class UnmodifiableList<T>[email protected]<T> { ... }

We can use type Annotations with generic type arguments:

List<@Email String> emails = ...
List<@[email protected]> messages = ...
Graph<@Directional Node> directedGraph = ...

Of course we can nest them:

Map<@NonNull String,[email protected]<@Readonly Document>> documents;

Or apply them to intersection Types:

public <[email protected]<E> &[email protected]> void foo(...) { ... }

Including parameter bounds and wildcard bounds:

class Folder<[email protected]> { ... }
Collection<[email protected]> c = ...
List<@Immutable ? extends Comparable<T>> unchangeable = ...

Generic method invocation with type annotations looks like this:

myObject.<@NotBlank String>myMethod(...);

For generic constructors, the annotation follows the explicit type arguments:

new <String>[email protected]()

Throwing exceptions:

void monitorTemperature()[email protected]{ ... }
void authenticate()[email protected]@Logged AccessDeniedException { ... }

Type annotations in instanceof statements:

[email protected];
[email protected]@Email String;

And finally Java 8 method and constructor references:

@Vernal Date::getDay
List<@English String>::size
Arrays::<@NonNegative Integer>sort

Conclusion

Type annotations are an interesting addition to the Java type system. They can be applied to any use of a type and enable a more detailed code analysis. If you want to use Type annotations right now you should have a look at the Checker Framework.
 

Reference: Java 8 Type Annotations from our JCG partner Michael Scharhag at the mscharhag, Programming and Stuff blog.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you our best selling eBooks for FREE!

 

1. JPA Mini Book

2. JVM Troubleshooting Guide

3. JUnit Tutorial for Unit Testing

4. Java Annotations Tutorial

5. Java Interview Questions

6. Spring Interview Questions

7. Android UI Design

 

and many more ....

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Want to take your Java skills to the next level?

Grab our programming books for FREE!

Here are some of the eBooks you will get:

  • Spring Interview QnA
  • Multithreading & Concurrency QnA
  • JPA Minibook
  • JVM Troubleshooting Guide
  • Advanced Java
  • Java Interview QnA
  • Java Design Patterns