2012-12-21 34 views
9

Tôi đang cố gắng sử dụng một phương pháp chung để tôi không phải lặp lại mã. Tôi đã thử:Phương pháp chung trong lớp không chung chung

private Listener createListenerAdapter(Class<T> clazz) 
{ 
    // do something 
} 

(clazz là quan trọng vì class được đặt trước).

Nhưng Netbeans than phiền rằng: "Không thể tìm thấy biểu tượng lớp T".

Tôi sẽ chuyển qua một vài lớp khác nhau có cùng phương pháp với chúng. Tôi phải định nghĩa T ở đâu?

Trả lời

27

Khai báo các phương pháp như:

private <T> Listener createListenerAdapter(Class<T> clazz) 

Xem Java Tutorials để biết thêm thông tin.

Edit: Nếu T không liên quan đến các kiểu trả về bạn cũng có thể chỉ cần sử dụng một ký tự đại diện:

private Listener createListenerAdapter(Class<?> clazz) 

Sửa 1: Nếu clazz có nghĩa là để đại diện cho một loại Listener, bạn có thể xác định giới hạn để hạn chế người gọi (để tránh các trường hợp ngoại lệ và thời gian chạy tiềm năng):

private <L extends Listener> L createListenerAdapter(Class<L> clazz) 

Hoặc với ký tự đại diện:

private Listener createListenerAdapter(Class<? extends Listener> clazz) 

Nhưng điều đó phụ thuộc vào cách clazz được sử dụng trong cơ thể.

+0

+1 Cảm ơn bạn .. Java là một chút gỉ. –

+0

'clazz' là một tiện ích GUI trong GWT. –

+0

Được rồi, vì vậy có lẽ 'Lớp 'là phù hợp nhất. –

3

tờ khai Generic cũng có thể được thực hiện tại phương pháp cấp bởi parametrizing họ như thế này:

private <T> Listener createListenerAdapter(Class<T> clazz) 
{ 
    // do something 
} 
0

Nếu bạn không sử dụng các loại (không, nhưng bạn có thể cố gắng để tránh một cảnh báo kiểu thô) :

private Listener createListenerAdapter(Class<?> clazz) 
{ 
    // do something, without knowing the T of the clazz 
} 
Các vấn đề liên quan