编程到接口 - 避免后来的转换

jn1*_*1kk 6 java interface

所以,据我所知,应该总是编程到一个接口,如:

List<Integer> list = new LinkedList<Integer>();
Run Code Online (Sandbox Code Playgroud)

所以,在我的课程后期,我有:

public List<Integer> getIntegers() {
    return list;
}

public void processIntegers() {
    // I need an arraylist here
    ArrayList<Integer> list = (ArrayList<Integer>) getIntegers(); // can I do this better, without a cast?
}
Run Code Online (Sandbox Code Playgroud)

我可以在这里遵循更好的模式,或者以某种方式做些什么来避免演员表演?在这种情况下,施法似乎非常难看.

谢谢.

Tom*_*icz 7

首先问自己一个问题:你为什么需要一个ArrayList?此外,您的API的客户应该关心它吗?你几乎没有选择:

  • 做出getIntegers()回报ArrayList<Integer>.这不是犯罪

  • 考虑不太强大的界面要求,例如AbstractList作为共识

  • 创建一个防御性副本,以便您可以使用任何List:

    ArrayList<Integer> list = new ArrayList<Integer>(getIntegers());
    
    Run Code Online (Sandbox Code Playgroud)

    考虑使用instanceof运算符以避免不必要的复制(如果getIntegers()已经是)ArrayList.

换句话说 - 没有办法以你的要求和优雅的方式避免这种铸造.