考虑以下类
public interface SortBy<S> {
}
public class CommentSortBy<S> implements SortBy<S> {
public static CommentSortBy<Date> CREATION = new CommentSortBy<Date>();
public static CommentSortBy<Integer> VOTES = new CommentSortBy<Integer>();
}
public class SomeQueryUnsafe {
public <M, S extends SortBy<M>> void setSort(S sortBy, M min) {
//Set relevant values
}
}
这目前用作:
public SomeQueryUnsafe createCommentQueryUnsafe() {
return new SomeQueryUnsafe();
}
public void test() {
createCommentQueryUnsafe().setSort(CommentSortBy.CREATION, new Date());
}
虽然这可行,但问题是createCommentQueryUnsafe()
没有指定对sortBy
. 用户可以自由通过UserSortBy.NAME
,即使在这种情况下这没有任何意义
我不知道如何写这个,因为只是添加<B extends SortBy>
到类签名意味着我失去了限制min
方法中参数的能力。我不能使用诸如<M, S extends B & SortBy<M>>
编译器错误之类的东西。其他使用通配符魔法的尝试只会导致更多的复杂性和编译器错误。将排序转移到createCommentQuery()
方法意味着每个查询都需要 2 个方法,这是大量重复的代码
我怎么可能编写泛型,从而createCommentQuery()
将sortBy
参数限制为仅CommentSortBy
同时仍然min
限制为 SortBy 类中的 S 参数?