Tôi có siêu lớp như:Tại sao tôi nhận được các phương thức lớp cơ sở thông qua sự phản chiếu khi lớp con ghi đè chúng?
class MyClass<T> {
public void setValue(T value){
//insert code
}
public T getValue(){
return null;
}
}
sau đó tôi có aa nguồn gốc cụ thể
class MyClassImp extends MyClass<String> {
@Override
public void setValue(String value){
//insert code
}
@Override
public String getValue(){
return null;
}
}
On phản ánh trên MyClassImpl
như:
Class clazz = MyClassImpl.class;
Method[] methods = clazz.getDeclaredMethods();
tôi nhận được cả hai thực hiện lớp cha java.lang.Object getValue()
, void setValue(java.lang.Object)
và java.lang.String getValue()
, void setValue(java.lang.String)
.
Theo tài liệu Java của Class.getDeclaredMethods()
vis-a-viz
Trả về một mảng các đối tượng Phương pháp phản ánh tất cả các phương pháp tuyên bố bởi lớp hoặc giao diện được đại diện bởi đối tượng Class này. Điều này bao gồm truy cập công cộng, được bảo vệ, mặc định (gói) và các phương thức riêng tư, nhưng không bao gồm các phương thức kế thừa. Các phần tử trong mảng được trả về không được sắp xếp và không theo bất kỳ thứ tự cụ thể nào. Phương thức này trả về một mảng có độ dài 0 nếu lớp hoặc giao diện khai báo không có phương thức nào, hoặc nếu đối tượng Class này đại diện cho một kiểu nguyên thủy, một lớp mảng hoặc là void. Phương thức khởi tạo lớp
<clinit>
không được bao gồm trong mảng được trả về. Nếu lớp khai báo nhiều phương thức thành viên công khai có cùng các kiểu tham số, chúng đều được bao gồm trong mảng được trả về.
Tại sao tôi nhận được triển khai loại siêu? Có điều gì tôi thiếu không?
Lý do tại sao tôi cần điều này là tôi gọi một cách phản ánh setValue
về triển khai lớp cơ sở, mà tôi đã thêm một số chú thích chú thích đặc biệt và tất nhiên các ràng buộc bổ sung.
Có thể là bản sao của lưu lượng truy cập http: // stackoverflow.com/questions/5756081/java-generics-reflection –
@RC: Tôi không thấy nó có thể trùng lặp với câu hỏi đó như thế nào. –
@RC đây không phải là một bản sao chính xác – amod