もひとつ電波。かなり無理矢理だけど。

annotation HasNameAndLargerThan(int i) applies Map {
  null != this.get("name");
  i < (int)this.get("length");
}

これはconstなメソッドという概念(この例だとMap#get())の存在が前提で、
実チェックはほとんど実行時。だけど宣言性はある。

//メソッド(関数)定義
void configure(Map@[HasNameAndLargerThanTen] conf) {
  処理。
}

Map@[HasNameAndLargerThan(0)] m = new HashMap();//実行時エラー(コンパイル通っちゃう…)
List@[HasNameAndLargerThan(0)] l = new LinkedList();//コンパイルエラー
Map n = new HashMap();
configure(n);                //コンパイルエラー
Map o = new HashMap();
o.put("name", "puge");
o.put("length", 1);
configure(([HasNameAndLargerThan(0)])o);
Map p = new HashMap();
o.put("name", "puge");
o.put("length", 1);
Map@[HasNameAndLargerThan(0)] q = ([HasNameAndLargerThan(0)])o;
configure(q);
Map@[HasNameAndLargerThan(123)] r = ([HasNameAndLargerThan(123)])o;//実行時エラー


…キャスト可否の定義も要りそうだな…。