Ecco il mio codice per Scene.java. Ha diversi tipi di oggetti, che sono tutti inclusi in un ArrayList comune chiamato targets
. Tutti condividono un metodo toString()
che restituisce il loro identificatore. Voglio utilizzare l'elenco targets
per determinare se c'è qualche oggetto nella scena corrispondente a un dato identificativo, indipendentemente dal suo tipo:Conversione da oggetto Java a sottoclasse
ArrayList<NPC> npcs = new ArrayList<NPC>();
ArrayList<Item> items = new ArrayList<Item>();
ArrayList<EnviromentalObject> enviromental_objects = new ArrayList<EnviromentalObject>();
ArrayList<Object> targets;
public Object check_for_target(String target_name){
targets.addAll(npcs);
targets.addAll(items);
targets.addAll(enviromental_objects);
for (Object target : targets){
if (target.toString() == target_name){
return target;
}
}
return null;
Ecco il codice in Game.java, che verifica la presenza di un dato identificativo . Se c'è una corrispondenza con la scena corrente, voglio conoscere il tipo dell'oggetto e trattarlo come il suo vero tipo. In questo momento, ho il seguente codice e sapevo che non avrebbe funzionato, ma forse mi aiuterà a farmi un'idea.
Object target = current_scene.check_for_target(target_name);
if (target == null){
System.out.println(UNRECOGNIZED_TARGET_MESSAGE);
} else {
String target_type = target.getClass().getName();
target = (target_type) target;
}
Quale sarebbe il modo corretto di ottenere il tipo di oggetto e poi essere in grado di utilizzare metodi che dell'oggetto? In questo momento, mi vengono dati solo i metodi di Object
. Devo creare una superclasse per NPC
, Item
e EnviromentalObject
?
Una parentesi: 'se (target .toString() == target_name) {'-> Questa linea ti darà dei problemi. Usa .equals() per gli oggetti. – Chill
È possibile utilizzare la parola chiave 'instanceof' per verificare il tipo di un oggetto. – Chill
Non una risposta alla tua domanda, ma più generale ... Stai usando un 'Elenco' di' Item's che è un problema separato dall'implementazione Lista scelta di 'ArrayList', quindi dovresti dichiarare' Elenco- voci = new ArrayList <>(); '- nota anche che non devi ripetere'
- 'sul lato destro. In questo modo, se in seguito decidi che 'LinkedList' funziona meglio, non devi ridichiarare tutto. –