@Documented @PolymorphicQualifier(value=UnknownUnits.class) @Retention(value=RUNTIME) @Target(value={TYPE_USE,TYPE_PARAMETER}) public @interface PolyUnit
Any method written using @PolyUnit conceptually has many versions: in each one, every instance of @PolyUnit has been replaced by a different unit qualifier such as @kg (kilograms) or @h (hours).
The following example shows how method triplePolyUnit can be used to process either meters or seconds:
@PolyUnit int triplePolyUnit(@PolyUnit int amount) { return 3*amount; } void testPolyUnit() { @m int m1 = 7 * UnitsTools.m; @m int m2 = triplePolyUnit(m1); @s int sec1 = 7 * UnitsTools.s; @s int sec2 = triplePolyUnit(sec1); //:: error: (assignment.type.incompatible) @s int sec3 = triplePolyUnit(m1); }