電子書籍の厳選無料作品が豊富!

次のようなプログラムを書きました。

class A<T> {
 public String display(T t) {
  return t.toString();
 }
}

public class Test extends A<String> {
 public String display(Object o) { //ここでコンパイルエラー
  return o.toString();
 }
 public static void main(String[] args) {
  Test test = new Test();
   test.display("hello, world");
 }
}

上で示した部分でコンパイルエラーが出ました。エラー内容は

名前の競合:型Testのメソッドdisplay(Object)は型A<T>のメソッドdisplay(T)と同じerasureを持っていますが、オーバーライドしません。

というものでした。この場合、
public class Test extends A<String>
と、TがStringであることを明示しているので、このプログラムではdisplay(Object)はdisplay(T) をオーバーロードしているのではないのでしょうか。

もしくは、もしdisplay(Object)とdisplay(T)が同じerasureを持っているなら、それでオーバーライドしていることにはならないのでしょうか?

A 回答 (1件)

単純にイレイジャが何かを理解していないのだと思います。


ジェネリクスの型は、型情報として残す必要がないためコンパイル時に消えます。
つまり、実際にはメソッドの引数はオブジェクト型として扱われます。
display(Object)がdisplay(T)をオーバーロードできないのはこのためです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

イレイジャについてもっと勉強してみます。
ありがとうございました。

お礼日時:2009/09/08 11:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!