2011-08-17 32 views
5

我有三個通用接口(其中兩個之間的逆關係),並要處理他們在一個遞歸方法:用遞歸和通用接口工作

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); 
} 

現在我想要做一些處理了遞歸在我Worker類:

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

我得到這個錯誤,我也沒有想通了,爲什麼這不工作或我怎麼能解決這個問題:

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>> 

回答

2

我修改了它,沒有使用通用通配符?,所以它編譯。
剔除方法的聲明無關的問題後:

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()); 
    } 
} 

我希望這些變化仍然適合您的設計 - 讓我知道,如果他們不爲你工作,我會盡力解決您的要求。

唷!堅強!

+0

我不確定有關更改'Role'接口方法的含義。我假設它返回'角色'的接口列表。我正在使用一些'@ Entity'實現的接口。遞歸方法在一個實用類中使用,dacwe的通配符「?」適用於我。 – Thor

2

正如你已經注意到了,你需要在其中一個參數指定類型U。你可以這樣做,或者如果你想忽略U類型,你可以使用?代替:

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

謝謝,這可能是解決我的問題。但是,如果我真的不知道類型,通常我只使用通配符「?」。這裏我確定它是'U'型的。 – Thor

+0

然後,你可以通過其他參數與「類型信息」,例如:'...遞歸(名單角色,類 UserClass的)'(而忽略參數).. – dacwe