Genericsとcast
あぁ、書き方が悪っかったですね。cast が入るのはメソッドを呼ぶ側であって、実装側ではないです。
例えばこんなの。
public class Foo { public static void main(String[] args) throws Exception { Method m1 = Foo.class.getMethod("m1", Object.class); System.out.println(m1.getReturnType().getName()); } public static void call() { Foo a = new Foo(); Foo b = m1(a); Foo c = m2(a); } public static <T> T m1(T obj) { return obj; } public static Foo m2(Foo obj) { return obj; } }
実行してみれば、m1 の戻り値の型が Object であることが分る。で、DL Java Decompiler だとか、Jad なんかで逆コンパイルすると call の中身はこんなの。
public static void call() { Foo foo = new Foo(); Foo foo1 = (Foo)m1(foo); Foo foo2 = m2(foo); }
ついでに、javap -c だとこう。
public static void call(); Code: 0: new #2; //class Foo 3: dup 4: invokespecial #11; //Method "<init>":()V 7: astore_0 8: aload_0 9: invokestatic #12; //Method m1:(Ljava/lang/Object;)Ljava/lang/Object; 12: checkcast #2; //class Foo 15: astore_1 16: aload_0 17: invokestatic #13; //Method m2:(LFoo;)LFoo; 20: astore_2 21: return
まぁ、その程度の話です。