Trong dự án hiện tại của tôi, tôi có các lớp được mô hình hóa như sau. Tại một số thời điểm, một phương thức như getReturnTypeForGetId()
được gọi trên các lớp A
và B
. Gọi phương thức với số A
trả về Integer
như mong đợi, nhưng B
trả về Serializable
.Thừa kế chung và gọi GetMethod(). GetReturnType()
Tôi thiếu gì ở đây? Tôi có bị cắn bởi một số điều tẩy xoá ghê tởm, hay tôi chỉ bỏ lỡ một số loại bối cảnh bối cảnh chung?
EDIT: Thêm một trên một thanh cuộn getId()
phương pháp để B
sửa chữa vấn đề này, nhưng tôi sẽ vẫn muốn hiểu những gì tôi đang chạy vào.
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"
}
}
Sẽ không dễ dàng hơn khi đạt được những gì bạn đang cố gắng sử dụng với các thẻ siêu loại? http://gafter.blogspot.com/2006/12/super-type-tokens.html – millimoose