该 partition 方法声明为这样
partition
public static <T> List<List<T>> partition(List<T> list, int size)
由于泛型类型变量的声明 T ,该方法变为通用,类型变量捕获使用的类型参数。你用 ? extends DataBean 作为一个类型参数,所以据说被捕获 T 。
T
? extends DataBean
所以现在 T 是真的 cap#1 of ? extends DataBean 。并且该方法设置为返回该值。换句话说,对于您的调用,它看起来像
cap#1 of ? extends DataBean
public static List<List<cap#1 of ? extends DataBean>> partition(List<cap#1 of ? extends DataBean> list, int size) {
捕获可以是任何扩展的类型 DataBean 。我们假设它是某种叫做的类型 SubBean 。该方法在概念上(实际上,捕获是真实类型),返回a
DataBean
SubBean
List<List<SubBean>>
但是您尝试将其返回值分配给类型的变量
List<List<? extends DataBean>>
但是因为 这个 ,即。嵌套的泛型类型不能很好地协同工作,你无法分配 List<List<SubBean>> 至 List<List<? extends DataBean>> 。
作为上一个链接建议的解决方案,您可以将声明更改为
public void doSomething(List<? extends DataBean> ids) { List<? extends List<? extends DataBean>> lists = partition(ids, 3); }
但我建议不要使用通配符 像泰德这样的解决方案。
您需要绑定类型以使其始终匹配。否则, ? 对于 lists 与...无关 ? 对于 ids 。您可以使用命名类型参数声明泛型方法,而不是使用通配符的泛型参数:
?
lists
ids
public <T extends DataBean> void doSomething(List<T> ids) { List<List<T>> lists = lists.partition(ids, MAX_ITEMS); }