关于接口的java一般问题

kuk*_*das 3 java interface

考虑到我有一个方法,它将List作为参数传递.在这个方法中,我想在该列表中使用例如ArrayList特定的函数(比如trimToSize()).处理这样的问题的一般方法是什么?这里有两个例子:
第一种方法(我认为这不好)

private void doSomething(final List<T> list) {
  // ... do something
  ((ArrayList<T>) list).trimToSize();
  // ... do something
}
Run Code Online (Sandbox Code Playgroud)

第二种方法(我觉得这个更好)

private void doSomething2(final List<T> list) {
final List<T> myList = new ArrayList<T>();
// Collections.copy(myList, list); or
myList.addAll(list);
((ArrayList<T>) myList).trimToSize();
//..do something
}
Run Code Online (Sandbox Code Playgroud)

我很好奇这是什么问题的最佳解决方案.

Chi*_*chi 12

好吧,首选的选择就是首先编写方法来获取ArrayList.如果您需要ArrayList特定的功能,该方法没有业务需要List.将确保参数属于正确类型的责任转移给调用者,并且不要在方法内乱搞它.


Igo*_*nov 6

private void doSomething(final ArrayList<T> list)如果只想将ArrayList作为参数,为什么不将方法声明为a ?

  • @David,如果它需要一个`ArrayList`,它接受一个`List`是没有意义的 (2认同)
  • 如果他希望它接受任何List,那么他应该在传入对象的函数内部调用的唯一方法是List接口中定义的那些方法.否则,当传递非ArrayList对象时,他会让自己处于错误状态. (2认同)