ArrayList<Link>无法转换为Links<Link>及List接口实现问题求助
问题分析与解决方法
第一个错误原因
Links<Link> 和 ArrayList<Link> 都是 List<Link> 的实现类,但它们之间没有继承关系,属于平级的不同类。Java不允许将一个类的实例直接赋值给另一个无继承关系的类类型变量,就像不能把HashMap实例赋值给TreeMap变量一样。
第二个错误原因
List 接口包含数十个抽象方法(如add()、remove()、get()、size()、subList()等),非抽象类实现接口时必须重写所有抽象方法,仅处理subList()远远不够,编译器会检查所有未实现的抽象方法并报错。
解决方案
方案1:放弃自定义Links类(最推荐)
如果只是需要一个List类型的变量,直接使用Java标准库提供的List接口和ArrayList实现类即可,完全没必要自定义Links:
List<Link> notVisitedLinks = new ArrayList<Link>();
方案2:让Links继承已实现List的类
如果确实需要自定义Links类,最简单的方式是让它继承ArrayList(或其他List实现类),这样无需自己重写所有List方法,还能添加自定义逻辑:
class Links<T> extends ArrayList<T> { // 在这里添加你的自定义方法或逻辑 } // 此时可以正常实例化并赋值 Links<Link> notVisitedLinks = new Links<Link>();
方案3:手动实现List接口的所有方法
如果必须直接实现List接口(不继承现有实现类),可以通过内部代理一个List实例来简化实现,避免重复编写逻辑:
class Links<T> implements List<T> { // 用ArrayList作为内部代理,处理所有List方法逻辑 private final List<T> innerList = new ArrayList<>(); // 重写size方法 @Override public int size() { return innerList.size(); } // 重写isEmpty方法 @Override public boolean isEmpty() { return innerList.isEmpty(); } // 重写contains方法 @Override public boolean contains(Object o) { return innerList.contains(o); } // 重写subList方法(你之前卡住的部分) @Override public List<T> subList(int fromIndex, int toIndex) { // 直接返回代理List的subList结果,或者转成Links类型返回 List<T> sub = innerList.subList(fromIndex, toIndex); Links<T> linksSub = new Links<>(); linksSub.addAll(sub); return linksSub; } // 必须重写List接口的其他所有方法,比如add、remove、get等 @Override public boolean add(T t) { return innerList.add(t); } @Override public T remove(int index) { return innerList.remove(index); } @Override public T get(int index) { return innerList.get(index); } // ... 其余List抽象方法均需按此方式重写 }
内容的提问来源于stack exchange,提问作者Damiens ROBERT
相关产品推荐
相关产品推荐

