En Java, es una buena práctica usar tipos de interfaz en lugar de clases concretas en las API.
Tu problema es que estás usando ArrayList
(probablemente en muchos lugares) donde realmente deberías estar usando List
. Como resultado, creó problemas para usted con una restricción innecesaria que la lista es ArrayList
.
Esto es lo que el código debe ser similar:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
Su propuesta de "solución" al problema era/es la siguiente:
new ArrayList(input.subList(0, input.size()/2))
que funciona haciendo una copia de la sublista No es una rebanada en el sentido normal. Además, si la sublista es grande, entonces hacer la copia será costoso.
Si está limitado por las API que no puede cambiar, de tal manera que se tiene que declaran inputA
como ArrayList
, usted podría ser capaz de implementar una subclase personalizada de ArrayList
en el que los subList
devuelve el método una subclase de ArrayList
. Sin embargo:
- Sería mucho trabajo diseñar, implementar y probar.
- Ahora ha agregado una nueva clase significativa a su base de código, posiblemente con dependencias en aspectos no documentados (y por lo tanto, "sujeto a cambios") de la clase
ArrayList
.
- Debería cambiar lugares relevantes en su base de código donde está creando instancias
ArrayList
para crear instancias de su subclase.
La solución "copiar la matriz" es más práctica ... teniendo en cuenta que estas no son verdaderas rebanadas.
¿Por qué insistes en usar una 'ArrayList'? Creo que puede faltarle un poco para entender cómo funcionan las interfaces porque 'List' y' ArrayList' no son "incompatibles" -'ArrayList' implementa 'List', y' List' probablemente contiene todos los métodos necesarios que necesita. – Bombe
Insisto en utilizar ArrayList porque es una pregunta de entrevista con un prototipo de método rígido. Claramente tengo una falta de comprensión, porque subList se supone que devuelve un tipo de lista, y sin embargo, no puedo convertir la lista devuelta a ArrayList. Así que dime hombre ... –
Es muy posible que necesite una 'ArrayList' porque luego necesita llamar a un método que acepte una' ArrayList'. Podría decirse que dicho método está mal diseñado y debería aceptar 'List', pero tales situaciones pueden surgir no solo en las preguntas de la entrevista, sino también en un código escrito por otros que no se puede simplemente cambiar. Los compañeros de trabajo y las bibliotecas no siempre son perfectos. – Gravity