- ベストアンサー
[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> かによって処理を変える良い方法は無いでしょうか? よろしくお願い致します。
- みんなの回答 (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 ); } } : : }
その他の回答 (1)
- himajin100000
- ベストアンサー率54% (1660/3060)
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
お礼
ありがとうございます! >こっちは読んですらいない の方と、そこからのリンクで理解できました。 そもそも、Genericsの存在理由がよく分かっていなかったようです。
お礼
Genericsは、そういうものだったんですね…。 himajinさんに頂いた回答とあわせ、理解できました。 コードまで書いて頂き、有難うございます! 参考にさせていただきます。