例えば、javaで「public void testMethod(List
試したコードはこちら。
package reflectgenericslisttest; import java.lang.reflect.Method; import java.util.LinkedList; import java.util.List; public class ReflectGenericsListTest { public static void main(String[] args) { ReflectGenericsListTest thisApp = new ReflectGenericsListTest(); thisApp.execute(); } public void execute() { LinkedList<String> list = new LinkedList<String>(); list.add("おはよう"); list.add("いただきます"); list.add("こんにちは"); list.add("いただきます"); list.add("こんばんは"); list.add("いただきます"); list.add("さようなら"); try { Method method = this.getClass().getMethod("testMethod", List.class); method.invoke(this, list); } catch(Exception exc) { exc.printStackTrace(); } } public void testMethod(List<String> arg) { System.out.println("testMethod"); for(String str : arg) System.out.println("\t" + str); } /* public void testMethod(List<Integer> arg) { System.out.println("testMethod"); for(Integer i : arg) System.out.println("\t" + i); } */ }
あれ? これってオーバーロードどうなるんでしょう?
と思ったらジェネリクスのオーバーロードはできないようです。 オーバーロードしてみたらエラーでname clashとかって言われました。 ↑のコードのコメントを外したらエラーメッセージの確認ができます。
name clash: testMethod(java.util.List
どうやらjdk6なら戻り値の型を変えればオーバーロードできるようですね。 でもそれはjdkのバグなので使ってはならないそうです。 エラーメッセージで検索したらそれっぽいのが見つかりました。
- togetter - 夜明けのBug -- genericsでオーバーロード
- stackoverflow - Java generics code compiles with javac, fails with Eclipse Helios
なんか、togetterの方の人たちは1時間でバグの情報仕入れてますね。 この人たちはどういう検索の仕方をしているんでしょうかね? アンテナ性能の差を痛感します。