Reutilización de código sin genéricos

Digamos que necesito crear 3 listas vinculadas, una para int, una para Strings y otra para un tipo diferente de objeto personalizado. Si estuviera usando genéricos, sería fácil hacer esto simplemente creando una lista enlazada, pero ¿hay alguna manera de evitar escribir el mismo código repetitivo 3 veces si no estuviera usando genéricos?

preguntado el 09 de enero de 11 a las 03:01

6 Respuestas

Si utiliza Integer en lugar de int, entonces sí. En este caso, los tres objetos son subclases de Object por lo que su clase de lista vinculada podría tratar con Objects.

El código se vería, aproximadamente, como:

class MyLinkedList{
    public void add(Object){...}
    public Object remove(Object){...}
    ...
}

Respondido el 09 de enero de 11 a las 06:01

Antes de la introducción de genéricos en Java 1.5, todas las Colecciones usaban el tipo Object, por lo que tendría una lista vinculada de Objetos. Luego tenía que asegurarse de que estaba agregando, recuperando y lanzando los tipos correctos.

No veo ninguna razón por la que no deba o no use genéricos, ya que el uso de Java 1.4 ya no es necesario o recomendado.

Respondido el 09 de enero de 11 a las 06:01

Ahh eso tiene sentido. No puedo usar genéricos porque esa es una de las restricciones de la asignación en la que estoy trabajando. - elemental009

Eso no suena como una asignación muy actualizada, excepto para demostrar el punto de que cada clase en Java extiende la clase base del objeto. - Daff

No podría usar el mismo código para ints vs Strings, pero asumiendo que se refería a Integers, entonces tendría que crear una LinkedList que almacena java.lang.Objects, que por cierto, es lo que hacen las LinkedLists genéricas.

Respondido el 09 de enero de 11 a las 06:01

Puede abstraer el tipo que maneja la lista vinculada en su propio tipo, digamos StringOrIntOrCustom, que tiene uno de cada tipo y una bandera que especifica cuál es el válido para usar. Sin embargo, deberá realizar muchas comprobaciones para asegurarse de que no está realizando una operación que un tipo no admita siempre que utilice este tipo de datos.

Respondido el 09 de enero de 11 a las 06:01

Puede hacerlo sin genéricos, pero no tendrá una verificación de seguridad de tipo en tiempo de compilación y tendrá que agregar todos los tipos de conversión manualmente.

Pero, de nuevo, esencialmente hará lo que hace el compilador cuando usa genéricos. Ahora es solo propenso a errores y manual.

Respondido el 09 de enero de 11 a las 06:01

Sí, puedes hacer esto y no es tan difícil.

abstract class ListNode {
   public ListNode next_;
};

interface ListNodeFactory {
   public ListNode createListNode();
}

Luego crea un List class manipula objetos ListNode. Tendrá una función a la que llama para crear un nuevo ListNode cuando lo necesite. La add El método tomaría un ListNodeFactory argumento. Sugeriría que la mayoría de los métodos sean protected porque es probable que ningún cliente que no sea una clase derivada lo use.

El crea una clase derivada de List para cada tipo. Tendrá que envolver cada método con uno que tome el tipo que desee. También tendrá que crear un ListNodeFactory implementación que crea nuevos nodos de lista con el tipo apropiado en ellos. También tendrá que lanzar el ListNode objetos que obtiene de recorridos o eliminaciones a los tipos apropiados para obtener los datos. Aquí hay un ejemplo:

class IntListNode extends ListNode {
   public int data_;
   public IntListNode(int x) {
      data_ = x;
   }
}

class IntListNodeFactory implements ListNodeFactory {
   IntListNodeFactory() {
       nextdataset_ = false;
   }
   IntListNodeFactory(int x) {
       nextdataset_ = true;
       data_ = x;
   }
   void setNextData(int x) {
       nextdataset_ = true;
       nextdata_ = x;
   }
   public ListNode createListNode() {
       if (!nextdataset_) {
          throw Exception("Tried to create a node with no data!");
       } else {
          ListNode result = new IntListNode(data_);
          nextdataset_ = false;
          return result;
       }
   }
}

Respondido el 09 de enero de 11 a las 07:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.