Come si aggiungono più tipi di oggetti a un arrayList?
C'è veramente un caso in cui si possono realisticamente aggiungere più tipi di oggetti ad una ArrayList in Java.
ArrayList
Se non si specifica un tipo per l'ArrayList, o se si specifica che il tipo è Object, qualsiasi oggetto (es. Dog o String come nella tua domanda) potrebbe essere aggiunto alla ArrayList.
ArrayList
Se specifichi il tipo come superclasse degli oggetti che saranno aggiunti (o interfaccia che tutti implementano), qualsiasi oggetto che si adatta a quel tipo potrà essere aggiunto. Per esempio, se avete due classi chiamate Cat e Dog che estendono entrambe la superclasse Pet, potreste aggiungere oggetti di entrambi i tipi Cat e Dog a ArrayList.
In entrambi i casi di cui sopra, questo è dovuto all'ereditarietà. Poiché ogni oggetto è una sottoclasse di Object, tutti corrispondono al tipo Object specificato. Dato che i gatti e i cani sono animali domestici, tutti corrispondono al tipo Pet specificato.
Perché c'è solo un caso realistico?
Presumo che tu voglia chiamare i metodi sui diversi oggetti nella tua ArrayList. Tuttavia, questo sarebbe molto difficile senza conoscere i tipi di ciascuno degli oggetti, poiché un metodo che esiste per una classe potrebbe non esistere per una classe diversa, che è il motivo per cui un tipo è tipicamente specificato per adattarsi a tutti gli elementi.
In base al concetto di polimorfismo, usare una ArrayList con il tipo come superclasse o interfaccia funziona perché le sottoclassi/classi che implementano l'interfaccia devono avere certi metodi o ereditati dalla superclasse o dall'interfaccia. Per esempio, diciamo che la classe Pet ha un metodo .getSpecies() che entrambe le sottoclassi ereditano, ma il codice all'interno del metodo per la classe Cat restituisce "Cat" e il metodo per la classe Dog restituisce "Dog". Quel metodo può essere chiamato sugli elementi dell'ArrayList perché è definito per la superclasse e quindi le sottoclassi devono averlo. Le sottoclassi sovrascrivono il metodo della superclasse, e durante il runtime, Java capisce di quale tipo si tratta attraverso il polimorfismo dinamico e la versione della sottoclasse per ciascuna sarà eseguita correttamente.
Un'ArrayList di oggetti non è quindi utile, poiché la classe Object ha solo metodi molto generali, e non sareste in grado di chiamare metodi specifici per le classi degli oggetti che sono stati aggiunti. Invece, se aveste una ArrayList di tipo Object e provaste a chiamare .getSpecies() su un elemento, il compilatore probabilmente mostrerebbe una linea rossa a ghirigori indicando l'errore che la classe Object non ha quel metodo.
Altre domande
Se vi steste chiedendo come creare più ArrayList, ciascuna con un diverso tipo di oggetto, il codice usato sarebbe ArrayList name = new ArrayList(); e potete specificare Type come desiderato. Each element added must then be of that type.
Don’t be afraid to create multiple lists if needed, and best of luck!