2012-05-15 39 views
6

Tôi cố gắng để mở rộng các lớp sau đây với nhà xây dựng (từ thư viện Ektorp):Lấy thuộc tính .class của một lớp generic

public class CouchDbRepositorySupport<T extends CouchDbDocument> implements GenericRepository<T> { 

... 

protected CouchDbRepositorySupport(Class<T> type, CouchDbConnector db) { 
... 

} 

Dưới đây là thực hiện của tôi:

public class OrderRepository extends CouchDbRepositorySupport<Order<MenuItem>> { 

    public OrderRepository(CouchDbConnector db) { 
     super(Order<MenuItem>.class, db); 

Vấn đề là với phần Order<MenuItem>.class. Trình biên dịch Java nói với tôi:

Syntax error on token ">", void expected after this 

Tôi đã thử với (Order<MenuItem>).class, Order.classnew Order<MenuItem>().getClass() không có may mắn hơn.

Tôi có thể làm gì để truy xuất thuộc tính .class của một lớp chung?

+1

Có vẻ như một trong những tuần này. –

+2

@PaulBellora Có thể vì bất kỳ truy vấn google hoặc truy vấn SO nào chỉ trả về các câu hỏi về việc tìm ra loại đối tượng chung trong thời gian chạy. Vấn đề này hơi khác. –

Trả lời

1

Nếu bạn thay đổi loại hình xuất bản loại bên trong, bạn có thể nhận nó theo cách này:

public class CouchDbRepositorySupport<C, T extends CouchDbRepositorySupport<C>> implements GenericRepository<T> { 
... 

    protected CouchDbRepositorySupport(Class<C> type, CouchDbConnector db) { 
     ... 
    } 

public class OrderRepository extends CouchDbRepositorySupport<MenuItem, Order<MenuItem>> { 

    public OrderRepository(CouchDbConnector db) { 
     super(MenuItem.class, db); 

Bạn có một vài lựa chọn về cách bạn khai báo các lớp cha mẹ; đây chỉ là một ví dụ.

Tuyên bố từ chối trách nhiệm: Tôi đã thực hiện việc này bằng tay mà không cần IDE, vì vậy có thể có một số vấn đề nhỏ về cú pháp với nó, nhưng khái niệm sẽ hoạt động.

2

Cú pháp đúng sẽ là:

Order.class 

Trong Java, Order<MenuItem>.classOrder.classcùng lớp trong thời gian chạy, các loại thông tin chung (tham số <MenuItem> loại) bị mất trong thời gian chạy vì type erasure - một hạn chế nghiêm trọng của hệ thống kiểu generic của Java.

+0

Trình biên dịch java không đồng ý với điều đó: 'Nhà xây dựng CouchDbRepositorySupport <Đặt hàng > (Lớp , CouchDbConnector) là không xác định ' –

+0

@jdreux bạn đã tự mình nói: _compiler_. Các kiểu generic được kiểm tra trong quá trình biên dịch, trong khi biểu thức 'Order .class' được đánh giá khi chạy, và khi chạy tham số kiểu' 'là _erased_ từ thông tin kiểu của lớp, như thể nó chưa bao giờ tồn tại –

+0

không phải là cú pháp cho Order .class vì nó tương đương với thời gian chạy không tồn tại? –

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