私の現在のプロジェクトでは、次のようにモデル化されたクラスがあります。ある時点で、A
とB
にはgetReturnTypeForGetId()
のようなメソッドが呼び出されます。 A
でメソッドを呼び出すと、Integer
が返されますが、B
はSerializable
を返します。ジェネリック継承と呼び出しGetMethod()。getReturnType()
私はここで何が欠けていますか?私はいくつかの凶悪な消去事件に噛まれてしまったのでしょうか、あるいは私は何らかの一般的な文脈の矛盾を見逃していますか?
EDIT:はB
修正問題にオーバーだらけgetId()
方法を追加し、私はまだ、私はに実行しているかを理解したいと思います。
import java.io.Serializable;
public class WeirdTester {
static interface Identifiable<T extends Serializable> {
T getId();
void setId(final T id);
}
static abstract class BaseEntity<T extends Serializable> implements Identifiable<T> {
private T id;
public T getId() { return id; }
public void setId(final T id) { this.id = id; }
}
static class A implements Identifiable<Integer> {
private Integer id;
public Integer getId() { return id; }
public void setId(final Integer id) { this.id = id; }
}
static class B extends BaseEntity<Integer> {}
@SuppressWarnings("unchecked")
private static <T extends Serializable, Q extends Identifiable<T>> Class<T> getReturnTypeForGetId(
final Class<Q> clazz) throws Exception {
return (Class<T>) clazz.getMethod("getId", (Class[])null).getReturnType();
}
public static void main(final String[] args) throws Exception {
System.out.println(getReturnTypeForGetId(A.class));
// CONSOLE: "class java.lang.Integer"
System.out.println(getReturnTypeForGetId(B.class));
// CONSOLE: "interface java.io.Serializable"
}
}
スーパータイプのトークンを使って何をしようとしているのかを簡単に達成できないでしょうか? http://gafter.blogspot.com/2006/12/super-type-tokens.html – millimoose