2009-09-13 34 views
11
public abstract class AbstractTool<AT extends AbstractThing> { 
    protected ArrayList<AT> ledger; 
    public AbstractTool() { 
     ledger = new ArrayList<AT>(); 
    } 

    public AT getToolAt(int i) { 
     return ledger.get(i); 
    } 

    // More code Which operates on Ledger ... 

} 

public class Tool<AT extends AbstractThing> extends AbstractTool { 
    public Tool() { 
     super(); 
    } 
} 

Làm cách nào để gọi chính xác siêu vượt qua AT chung của Tool cho hàm tạo AbstractTool?Mở rộng Lớp Tóm tắt Chung & Sử dụng Chính xác Siêu

Có vẻ như không có vấn đề gì tôi chọn AT là khi tôi tuyên bố Tool (Say, Tool<Thing>), mà tôi luôn nhận lại một AbstractThing thay vì Thing. Điều này dường như đánh bại mục đích của generics ...

Trợ giúp?

Trả lời

19
public class Tool<AT extends AbstractThing> extends AbstractTool<AT> { 

Nói cách khác, nếu bạn mở rộng hoặc thực hiện điều gì đó bằng generics, hãy nhớ xác định các đối số generics cho chúng.

+1

Thực tế trong trường hợp này, vì các ràng buộc kiểu trên tham số chung của AbstractTool sẽ được kế thừa, bạn chỉ có thể viết 'public class Tool mở rộng AbstractTool '. Điều này sẽ có chức năng tương đương vì định nghĩa của AbstractTool sẽ ngăn bạn sử dụng một tham số chung không phải là 'AbstractThing'. –

3

Không nên là Tool<AT extends...> extends AbstractTool<AT>?

0

Tôi nghĩ rằng những gì bạn có thể muốn là:

public abstract class AbstractTool<AT extends AbstractThing> { 
     protected List<AT> ledger = new ArrayList<AT>(); 

     public AT getToolAt(int i) { 
      return ledger.get(i); 
     } 

     // More code Which operates on Ledger ... 

    } 

    public class Tool extends AbstractTool<Thing> { 
     // Tool stuff ... 
    } 

Kể từ Tool là một lớp bê tông, nó không cần phải được parametrized riêng của mình. Không cần thiết cho các nhà xây dựng nếu bạn khởi tạo List (oh và nhớ chương trình giao diện) tại khai báo, và bởi vì nó được bảo vệ các lớp con có thể truy cập trực tiếp.

+0

Thare thực sự là một số sự kiện mà nó rất hữu ích để có parametrizations của các lớp bê tông. ArrayList, LinkedList, HashMap, HashSet, tất cả chúng đều được parametrized, và tất cả chúng đều là các lớp cụ thể. –

+1

Tôi không nói là không có. Nhưng nó đơn giản hóa mã khách hàng rất nhiều nếu bạn không phải. Lớp kiểu container rõ ràng cần các kiểu cụ thể của chúng được tham số hóa, và có lẽ tôi đã đọc quá nhiều vào ví dụ tối thiểu, nhưng tôi không nghĩ rằng OP yêu cầu nó. – Robert

+0

OK, tôi hiểu điểm của bạn :) –

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