2011-08-17 24 views
5

tôi có ba giao diện chung (với một mối quan hệ nghịch đảo giữa hai trong số họ) và muốn xử lý chúng trong một phương pháp đệ quy:Làm việc với Đệ quy và Generic Giao diện

public interface User<R extends Role<R,U>, U extends User<R,U>> 
{ 
    public R getRole(); 
    public void setRole(R role); 
} 

public interface Role<R extends Role<R,U>,U extends User<R,U>> 
{ 
    public List<R> getRoles(); 
    public void setRoles(List<R> roles); 

    public List<U> getUser() ; 
    public void setUser(List<U> user); 
} 

Bây giờ tôi muốn làm một số xử lý với một đệ quy trong lớp Worker tôi:

public <R extends Role<R,U>,U extends User<R,U>> void recursion(List<R> roles) 
{ 
    for(R role : roles) 
    { 
    recursion(role.getRoles()); 
    } 
} 

tôi nhận được lỗi này và tôi đã không tìm ra lý do tại sao điều này không làm việc hoặc làm thế nào tôi có thể giải quyết này:

Bound mismatch: The generic method recursion(List<R>) of type Worker is not 
applicable for the arguments (List<R>). The inferred type User<R,User<R,U>> 
is not a valid substitute for the bounded parameter <U extends User<R,U>> 

Trả lời

2

Tôi đã sửa đổi nó, không sử dụng các ký tự đại diện chung ?, do đó nó biên dịch.
Sau khi tước ra tờ khai phương pháp không liên quan đến các vấn đề:

public interface Role<R extends Role<R, U>, U extends User<R, U>> { 
    public List<Role<R, U>> getRoles(); // Change here to return type 
} 

public interface User<R extends Role<R, U>, U extends User<R, U>> { // No change 
} 

// Change to method parameter type 
public static <R extends Role<R, U>, U extends User<R, U>> void recursion(List<Role<R, U>> roles) { 
    for (Role<R, U> role : roles) { // Change to element type 
     recursion(role.getRoles()); 
    } 
} 

Tôi hy vọng những thay đổi này vẫn phù hợp với thiết kế của bạn - cho tôi biết nếu họ không làm việc cho bạn và tôi sẽ cố gắng để làm việc xung quanh yêu cầu của bạn.

Phew! Một khó khăn!

+0

Tôi không chắc chắn về ý nghĩa của việc thay đổi phương thức giao diện cho 'Role'. Tôi giả sử nó trả về một danh sách giao diện của 'vai trò'. Tôi đang sử dụng các giao diện cho một số triển khai '@ Entity'. Phương thức đệ quy được sử dụng trong một lớp tiện ích, có lẽ đề xuất ký tự đại diện '? 'Của dacwe phù hợp với tôi. – Thor

2

Như bạn đã nhận thấy, bạn cần chỉ định loại U trong một trong các đối số. Bạn có thể làm điều đó hoặc nếu bạn muốn bỏ qua kiểu U bạn có thể sử dụng thay vì ?:

public <R extends Role<R,?>> void recursion(List<R> roles) 
{ 
    for(R role : roles) 
    { 
    recursion(role.getRoles()); 
    } 
} 
+0

Cảm ơn, đây có thể là giải pháp cho tôi. Nhưng thông thường tôi chỉ sử dụng ký tự đại diện '?' Nếu tôi thực sự không biết loại. Ở đây tôi chắc chắn nó thuộc loại 'U'. – Thor

+0

Sau đó, bạn có thể chuyển một tham số khác với "thông tin loại" đó, ví dụ: '... đệ quy (Liệt kê vai trò, Lớp userClass)' (và bỏ qua tham số) .. – dacwe

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