Escolar Documentos
Profissional Documentos
Cultura Documentos
Parser Program
C(Object p)
Object field
Object get()
Comments
return
@NonNull
C(Object p)
Object field
Object get()
@NonNull @NonNull
= return
Annotation Definition
Structured Data
Comparable to records in OCaml
@interface MyAnnotation { String value(); // member int i() default 123; // member w. default value } @interface MarkerAnnotation { // annotation without any members }
Annotation Usage
@MyAnnotation(value="text", i=456) void method() { } // default value for i: 123 @MyAnnotation(value="text") void method2() { } // special case for members called "value" @MyAnnotation("text") void method3() { } // parenthesis can be omitted if no members @MarkerAnnotation void method4() { }
Annotation Members
@interface MyAnnotation { int String Class SomeEnum intMember(); stringMember(); classMember(); enumMember(); // // // // primitives strings class literals enums
Types
Type parameters HashMap<@A String, Object> m; Inheritance, bounds class MyClass<T extends @B Number> implements @C SuperClass { } Object creation new @D Integer(5); Class literals Class<@E String> c = @E String.class; Static fields @F MyClass.field Type casts String s = (@G String) myObject;
Arrays
String @B[][] a = new String @B[10][2];
Method Receivers
public String toString() @C { } As opposed to return type public @D String toString() { }
Backward-Compatible to pre-JSR308
Annotations can be written as comments public String toString() /*@C*/ { }
Parser
Type Checker
AST
Error
10
Parser
AST
Error
Error
11
Nullness checker
@NonNull Object foo = null; // error: null!
Interning checker
@Interned String a = "x".intern(); String b = "x"; if (a==b) // error: identity vs. equality
12
Nullness Checker
@TypeQualifier @SubtypeOf( {} ) @interface Nullable { } @TypeQualifier @SubtypeOf( { Nullable.class } ) @interface NonNull { } @Nullable
Object
@NonNull Object
@Nullable Date
@NonNull Date
13
Nullness Checker
14
Suggested Extensions
Problem: ambiguous
@interface @Sample { int value() default 0; } return @Sample(1) +1; // return @Sample(value=0) (1)+1; or // return @Sample(value=1) +1; ???
15
Resolving Ambiguity
16
Parser
Type Annotation Code Class File Checker Checker Generator Writer Class File
Error
Error
17
AST Generation
Source File
class C { @NonNull Object field; C(@NonNull Object p) { field = p; } @NonNull Object get() { return field; } }
Parser
Type Annotation Code Class File Checker Checker Generator Writer Class File
Error
Error
18
Java
@Code @Escape @Run
19
let rec power(x, n) = match n with 0 -> .<1>. | n -> .<.~x * .~(power (n-1, x))>.;; let square = .! .<fun x -> .~(power (.<x>., 2))>.;;
20
Summary
Add annotations on
Block statements Parenthetical expressions
@A { } @A ( )