泛型构造器传入接口实现类集合报错问题排查
问题梳理与解决复盘
哈哈,这个问题真的是典型的“当局者迷”!我之前也因为类似的小坑卡过半天,让我帮你理清楚来龙去脉:
你遇到的场景还原
首先还原你碰到的整个流程:
- 第一步:定义了
Sortable接口,然后编写了LeftSort类:
public class LeftSort { private List<Sortable> list; public <T extends Sortable> LeftSort(List<T> list) { this.list = list; } }
- 第二步:写了实现
Sortable接口的Foo类:
public class Foo implements Sortable {}
- 第三步:在JUnit测试里执行代码时,突然收到错误提示:
The constructor LeftSort(List<Foo>) is undefined
List<Foo> list = new ArrayList<Foo>(); // 初始化操作 LeftSort sorter = new LeftSort(list);
错误原因排查
一开始你以为是泛型用法的问题,甚至尝试把成员变量改成private List<? extends Sortable> list;,结果还是报错。直到后来才发现——居然是导入了错误的类!你实际代码里用的是Test类(示例里写成了Foo),而那个Test类根本就没有实现Sortable接口!
其实你的泛型写法本身完全没问题:<T extends Sortable>的构造器参数List<T>,本来就可以接收List<Foo>这种实现了Sortable的子类集合。报错的根源完全是因为实际使用的类没正确实现接口,属于很容易忽略的低级错误。
总结
这种“看起来是泛型问题,实际是类实现/导入错误”的坑真的很容易踩,尤其是当类名相近或者复制代码时,很容易忽略这个细节。下次碰到类似的构造器未定义错误,除了检查泛型语法,也可以先确认一下传入的类是不是真的符合泛型约束~
内容的提问来源于stack exchange,提问作者user5549921
相关产品推荐
相关产品推荐

