在 Java 中,最好在 API 中使用接口类型而不是具体类。
你的问题是你1正在使用(可能在很多地方)你应该真正使用的地方。因此,您为自己制造了问题,并提出了不必要的约束,即列表是.ArrayList
List
ArrayList
这是你的代码应该是什么样子的:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
1 - 根据您的评论,“您”实际上是其他人...谁在面试问题中设置了这个问题。这实际上可能是一个棘手的问题,旨在了解您将如何应对创建与ArrayList兼容的赋值的ArrayList
的(真实)切片。
您提出的问题的“解决方案”是这样的:
new ArrayList(input.subList(0, input.size()/2))
这可以通过创建子列表的副本来工作。它不是正常意义上的切片。此外,如果子列表很大,那么复制将很昂贵。
如果您受到无法更改的 API 的约束,因此必须声明为 ,则可以实现一个自定义子类,其中该方法返回 的子类。然而:inputA
ArrayList
ArrayList
subList
ArrayList
- 设计,实现和测试将需要大量的工作。
- 现在,您已经向代码库添加了重要的新类,可能依赖于类的未记录方面(因此“可能会发生变化”)。
ArrayList
- 您需要更改代码库中要创建实例的相关位置,以改为创建子类的实例。
ArrayList
“拷贝阵列”解决方案更实用...请记住,这些不是真正的切片。