最近整合一个第三方类库,遇到了泛型的问题。绕来绕去的自己有点蒙了已经,所以记录下随笔
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的方法,但是接口定义中就没有了。