- - PR -
アノテーションに @Override があるのに @Implements のようなものがないのはなぜ?
1
投票結果総投票数:7 | |||
---|---|---|---|
あってもよい | 3票 | 42.86% | |
どっちでもよいがたまたまないだけ | 3票 | 42.86% | |
あったらダメ | 1票 | 14.29% | |
|
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-10 14:45
私は、Java の新機能に疎く、いまのところアノテーションというものがあるという知識であり、とりあえずコーディング時に @Override が付けられる場面では付けている、という程度なのですが、件名のような疑問を持っています。
たとえば、つぎのようなコードの場合、
というように @Implements (と仮に名付けた)というアノテーションを付けられたほうが便利だと思うのです。しかし、アノテーションには @Override はありますが、@Implements に相当するような機能はないようです。なぜないのでしょう? これは、結局は interface と abstract class との違い、ということに帰結するのだろうと予想しています。これについては過去にもこの掲示板でいろいろ質問させていただきました。 しかし、@Implements がないという理由がやはり分かりません。あってもいいんじゃないかと思うんですが、どうでしょうか? それともあったらダメなのでしょうか?(なにか破たんするようなことがあるのでしょうか?) | ||||||||
|
投稿日時: 2007-02-10 15:57
アノテーションというのは、コンパイラへの指示あるいはヒントだと思うのですが、
そもそもimplementsキーワードで実装するインタフェースを示すことができるのに、 さらにアノテーションで明示する必要性はないと思うのですが。 | ||||||||
|
投稿日時: 2007-02-10 16:42
ありがとうございます。コンパイラーに対する指示、というのはあまり意識していませんでした。(ソースコードを読む)人に対する指示という面を意識していました。 ただ、アノテーションをあくまでもコンパイラーに対する指示だとすれば、
のように付けることができる @Override はなんのために存在するのか、という疑問が出てきます。 | ||||||||
|
投稿日時: 2007-02-10 17:07
というクラスがあったとします。 そしてHogeというクラスを以下のように修正したとします。
この場合、JDK1.4まではHogeは具象クラスなので、 Piyoもコンパイルエラーにはなりません。 しかし、@Overrideによってエラーとすることができます。 いまどきIDEで開発するでしょうし、 メソッド名の変更はリファクタリングを行うでしょうから、 存在意義は薄いといえます。 また@OverrideのRetentionがSOURCEなので、コンパイラが対応している必要もあります。 | ||||||||
|
投稿日時: 2007-02-10 17:20
追記ですが、スーパークラスのメソッドの引数を変更する場合、
リファクタリングによる引数追加も可能ですが、 私の場合は直接修正してしまうことが多いです。 (わかっているのですが、極力やってはいけないことではあります) なので、そういうケースでもエラーとさせれるので有効かもしれませんね。 | ||||||||
|
投稿日時: 2007-02-10 19:35
@Override の役割に関してはかつのりさんが既に書いていらっしゃるとおりだと思います。
ちなみに、mustang からはコンパイラの挙動が変わって、implements なメソッドに @Override をつけてもコンパイルエラーにはならなくなったようです。 例えば、
| ||||||||
|
投稿日時: 2007-02-11 10:48
ありがとうございます。JDK 1.6.0 でコンパイルしてみましたが、おっしゃるとおりコンパイルできました。 (ちなみに、Eclipse 3.2.1 では、JDK Compliance の Compiler compliance level を 6.0 にしてもコンパイルエラーになりました。) 個人的な感想としては、キーワードは @Override と違うものにしてほしかったです。 今の JDK 1.6.0 の仕様だと、 ・interface ・class の abstract なメソッド ・class の abstract ではないメソッド のどれを実装する場合でも、キーワードは @Override ひとつですが、3通りのキーワードでそれぞれを区別できるようにしてほしかったです。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} |
1