2011-10-21 25 views
5

Nói rằng tôi có một lớp như sauJava phản ánh: Nhận kiểu dữ liệu cụ của giao diện chung thực hiện

public class AtomEntryHandler implements ConsumingHandler<AtomEntry> 
{ 
... 
} 

Có thể để có được những AtomEntry.class đối tượng lớp từ đối tượng lớp của AtomEntryHandler.class?

Tôi không nghĩ rằng điều đó là có thể do xóa bỏ, nhưng một người bạn đã nói.

+0

Bạn của bạn có nói như thế nào không? –

+2

không, vì thế câu hỏi :-D – ekj

+0

Câu trả lời của Alex Gitelman có phù hợp với bạn không? –

Trả lời

4

Tôi không thể tìm ra cách xác định tham số kiểu cơ sở trong trường hợp triển khai giao diện (điều này không có nghĩa là không có). Nhưng điều này là gần như nó được với nó.

import java.lang.reflect.*; 
public class Foo { 
    static class Bar<T> { 
    } 
    static class SubBar extends Bar<Integer> { 
    } 

    public static void main(String argv[]) { 
    ParameterizedType pt = (ParameterizedType)SubBar.class.getGenericSuperclass(); 
    Type[] t = pt.getActualTypeArguments(); 
    for (int i=0;i<t.length;i++) { 
     System.out.println(t[i]); 
    } 
    } 
} 

Kết quả: class java.lang.Integer

8

Bạn có thể nhận được các loại chung cho cả hai giao diện và các lớp con trực tiếp, nhưng chỉ dành cho việc thực hiện cụ thể. Ví dụ, nếu bạn có một cá thể List<T>, bạn không có cách nào để biết nó được tham số hóa vì kiểu xóa. Nếu định nghĩa lớp bao gồm các loại tham số được biết tại thời gian biên dịch (ví dụ: class StringList extends List<String>) thì bạn có thể truy xuất thông tin đó.

ParameterizedType pt = (ParameterizedType)AtomEntryHandler.class.getGenericInterfaces()[0]; 
Class atomEntryClass = (Class)pt.getActualTypeArguments()[0]; 
+2

Tôi đọc về giao diện trong tài liệu, nhưng nếu lớp thực hiện giao diện tham số như trong câu hỏi (và không mở rộng bất kỳ lớp nào rõ ràng), bạn sẽ nhận được 'java.lang.Object' và bỏ trường hợp ngoại lệ khi truyền tới' ParameterizedType'. –

+0

Nếu bạn gọi 'getGenericSuperclass()' và bạn không mở rộng bất cứ điều gì hoặc bạn mở rộng các lớp không chung chung, đó là sự thật, nhưng nếu bạn gọi 'getGenericInterfaces()' thì lớp heirarchy không quan trọng vì nó chỉ xử lý giao diện. –

1

Nếu bạn tình cờ biết ConsumingHandler là giao diện chỉ AtomEntryHandler dụng cụ, và bạn tình cờ biết nó chỉ mất một đối số kiểu, bạn có thể làm điều này:

interface ConsumingHandler<T> {} 

class AtomEntry {} 

class AtomEntryHandler implements ConsumingHandler<AtomEntry> 
{ 
    public static void main(String[] args) 
    { 
     Type[] interfaces = AtomEntryHandler.class.getGenericInterfaces(); 
     ParameterizedType firstInterface = (ParameterizedType) interfaces[0]; 
     Class c = (Class) firstInterface.getActualTypeArguments()[0]; 
     System.out.println(c.getName()); // prints "AtomEntry" 
    } 
} 

Nếu không, bạn có thể poke xung quanh trong getGenericInterfaces() và của họ actualTypeArguments cho đến khi bạn tìm thấy một cái gì đó trông giống như những gì bạn đang tìm kiếm. Nhưng nếu bạn thấy mình cần làm điều này trong mã thực, có thể có điều gì đó không ổn trong thiết kế của bạn, hoặc bạn đang viết thư viện đối tượng giả thiên tài điên và bạn không cần chúng tôi trả lời những câu hỏi này.

+0

Vâng, tôi đã chơi với nó, và nó làm cho đoạn mã phức tạp hơn nó cần phải có. Nó sẽ chỉ tránh được một số trùng lặp nếu nó đơn giản. – ekj

Các vấn đề liên quan