Ich weiß nicht warum, aber das JLS ist sehr klar:
Discussion
Note that null is not a legal element value for any element type.
Und die Definition eines Standardelements lautet:
DefaultValue:
default ElementValue
Leider stelle ich immer wieder fest, dass die neuen Sprachfunktionen (Enums und jetzt Annotations) sehr wenig hilfreiche Compiler-Fehlermeldungen enthalten, wenn Sie die Sprachspezifikation nicht erfüllen.
EDIT: Ein wenig googleing fanden die folgende in der JSR-308, wo sie argumentieren für nulls in dieser Situation erlaubt:
Wir stellen einige mögliche Einwände gegen den Vorschlag fest.
Der Vorschlag macht nichts möglich, was vorher nicht möglich war.
Der vom Programmierer definierte Sonderwert bietet eine bessere Dokumentation als null, was "keine", "nicht initialisiert", null selbst usw. bedeuten kann.
Der Vorschlag ist fehleranfälliger. Es ist viel einfacher, die Prüfung gegen Null zu vergessen, als die Prüfung auf einen expliziten Wert zu vergessen.
Der Vorschlag kann die Standardsprache ausführlicher machen. Derzeit müssen nur die Benutzer einer Anmerkung nach ihren speziellen Werten suchen. Mit dem Vorschlag müssen viele Tools, die Anmerkungen verarbeiten, prüfen, ob der Wert eines Felds null ist, damit sie keine Nullzeigerausnahme auslösen.
Ich denke, nur die letzten beiden Punkte sind relevant für "warum nicht überhaupt?". Der letzte Punkt bringt sicherlich einen guten Punkt auf den Punkt - ein Annotationsprozessor muss sich niemals Sorgen machen, dass er eine Null für einen Annotationswert erhält. Ich neige dazu, dass es eher die Aufgabe von Annotationsprozessoren und anderem solchen Framework-Code ist, diese Art von Überprüfung durchführen zu müssen, um den Entwicklercode klarer zu machen, als umgekehrt, aber es würde es sicherlich schwierig machen, eine Änderung zu rechtfertigen.
Class<? extends Foo> bar();
.