J'essaie de créer un arraylist de différentes instances de classe. Comment créer une liste sans définir de type de classe? (<Employee>)
List<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee());
Employee employee = employees.get(0);
Vous pouvez créer une liste d'objets comme List<Object> list = new ArrayList<Object>()
. Comme toutes les implémentations de classes s'étendent implicitement ou explicitement à partir de la classe Java.lang.Object
, cette liste peut contenir n'importe quel objet, y compris les instances de Employee
, Integer
, String
etc.
Lorsque vous récupérez un élément de cette liste, vous récupérez une Object
et non plus une Employee
, ce qui signifie que vous devez effectuer une conversion explicite dans ce cas de la manière suivante:
List<Object> list = new ArrayList<Object>();
list.add("String");
list.add(Integer.valueOf(1));
list.add(new Employee());
Object retrievedObject = list.get(2);
Employee employee = (Employee)list.get(2); // explicit cast
List<Object> objects = new ArrayList<Object>();
objects
liste acceptera l’un des Object
Vous pouvez concevoir comme suit
public class BaseEmployee{/* stuffs */}
public class RegularEmployee extends BaseEmployee{/* stuffs */}
public class Contractors extends BaseEmployee{/* stuffs */}
et en liste
List<? extends BaseEmployee> employeeList = new ArrayList<? extends BaseEmployee>();
List anyObject = new ArrayList();
or
List<Object> anyObject = new ArrayList<Object>();
maintenant anyObject
peut contenir objects of any type
.
utilisez instanceof pour connaître what kind of object it is
.
Si vous ne pouvez pas être plus spécifique que Object
avec vos instances, utilisez:
List<Object> employees = new ArrayList<Object>();
Sinon, soyez aussi précis que possible:
List<? extends SpecificType> employees = new ArrayList<? extends SpecificType>();
Je crois que votre meilleur coup est de déclarer la liste comme une liste d'objets:
List<Object> anything = new ArrayList<Object>();
Ensuite, vous pouvez y mettre ce que vous voulez, comme:
anything.add(new Employee(..))
Evidemment, vous ne pourrez rien lire en dehors de la liste sans un casting approprié:
Employee mike = (Employee) anything.get(0);
Je découragerais l'utilisation de types bruts tels que:
List anything = new ArrayList()
Etant donné que les génériques ont précisément pour objectif de les éviter, à l'avenir, Java ne peut plus importer de types bruts, les types bruts sont considérés comme hérités et une fois que vous utilisez un type brut, vous ne pouvez plus utiliser de génériques dans une référence donnée. Par exemple, jetez un oeil à cette autre question: Combinaison de types bruts et de méthodes génériques
Comment créer une liste sans définir de type de classe? (
<Employee>
)
Si je lis ceci correctement, vous voulez juste éviter de spécifier le type, n'est-ce pas?
En Java 7, vous pouvez faire
List<Employee> list = new ArrayList<>();
mais aucune des autres solutions en cours de discussion ne fera que sacrifier la sécurité de type.