@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);
  }