• ベストアンサー

[Java1.5]Genericsとオーバーロード

現在、Eclipseの上でJavaプログラミングを行っています。 ところが、オーバーロードを行う際にエラーとなり困っています。 疑問点と、解決策をお聞きできるとありがたく思います。 あるプログラムで、単純に言うと以下のようなオーバーロードを行いました。 public static String theFunction(Map<Integer, Integer> theMap){       ・・・ } public static String theFunction(Map<Integer, String> theMap){       ・・・ } すると、一つ目のメソッドに対し Duplicate method theFunction(Map<Integer, Integer> theMap) in ... 二つ目のメソッドに対し Duplicate method theFunction(Map<Integer, String> theMap) in ... というエラーが出てしまいました。 こういうものなのでしょうか? つまり、同じ型のGenericsは、その要素の型が違っていても同一視されるのでしょうか。 またその場合、代替策は無いでしょうか? つまり、 theFunction(x); とした時、x が Map<Integer, Integer> か Map<Integer, String> かによって処理を変える良い方法は無いでしょうか? よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

Genericsはコンパイル時の型チェックまでで、実行時には失われてしまいます。 なので、コンパイル後のtheFunctionは両方とも theFunction( Map theMap ) として扱われます。 代替策としては、MapのValue値の型を見て処理を振り分ける、くらいでしょうか。 public static String theFunction(Map theMap){ Set keySet = theMap.keySet(); for ( Object key : keySet ) { Object value = theMap.get( key ); if ( value instanceof Integer ) { theFunction_inner_Integer( key, value ); } else if( value instanceof String ){ theFunction_inner_String( key, value ); } }    :    : }

elmsley
質問者

お礼

Genericsは、そういうものだったんですね…。 himajinさんに頂いた回答とあわせ、理解できました。 コードまで書いて頂き、有難うございます! 参考にさせていただきます。

その他の回答 (1)

回答No.1

http://www-06.ibm.com/jp/developerworks/java/050218/j_j-jtp01255.html とりあえず俺は今ひとつ理解できてないような気がするが 参考にはなりそうだと思ったんで投稿。 こっちは読んですらいない http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34513&forum=12&5

elmsley
質問者

お礼

ありがとうございます! >こっちは読んですらいない の方と、そこからのリンクで理解できました。 そもそも、Genericsの存在理由がよく分かっていなかったようです。

関連するQ&A