最近整合一個第三方類庫,遇到了泛型的問題。繞來繞去的自己有點蒙了已經,所以記錄下隨筆
public interface QueryApi<T extends QueryApi<?,?>,U>
public abstract class QueryApiImpl<U> implements QueryApi<QueryApiImpl<?>,U>
public interface TaskQueryApi<T extends OrderFlow> extends QueryApi<TaskQueryApi<?>, T>
public class TaskQueryApiImpl<T extends OrderFlow> extends QueryApiImpl<T> implements TaskQueryApi<T>
以上,編譯報錯
問題在於public interface TaskQueryApi<T extends OrderFlow> extends QueryApi<TaskQueryApi<?>, T>這句。
修改為
public interface TaskQueryApi<T extends OrderFlow> extends QueryApi<QueryApiImpl<?>, T>後正常。
分析原因:TaskQueryApi實現了QueryApi,其中第一個泛型參數是TaskQueryApi
QueryApiImpl同樣實現了QueryApi,其中第一個泛型參數是QueryApiImpl
所以,當TaskQueryApiImpl實現TaskQueryApi,同時集成了QueryApiImpl。這樣就有兩份向上的泛型參數,但是泛型的實例類型並不相同,導致報錯。
當然這裡TaskQueryApi也可以不集成QueryApi。這樣,實現類裡有QueryApi的方法,但是接口定義中就沒有了。