2012-06-17 17 views
9

Estoy intentando crear una lista de matrices de diferentes instancias de clases. ¿Cómo puedo crear una lista sin definir un tipo de clase? (<Employee>)Crear lista de instancias de diferentes objetos

List<Employee> employees = new ArrayList<Employee>(); 
employees.add(new Employee()); 
Employee employee = employees.get(0); 

Respuesta

13

Se puede crear una lista de objetos como List<Object> list = new ArrayList<Object>(). Como todas las clases aplicación se extiende implícita o explícita de java.lang.Object clase, esta lista puede contener cualquier objeto, incluidos los casos de Employee, Integer, etc. String

Cuando se recupera un elemento de esta lista, se le recuperar un Object y sin ya no es un Employee, lo que significa que tienen que realizar una conversión explícita en este caso como sigue:

lista
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 
+0

Lista ejemplo = new ArrayList <>(); ejemplo.get (0) .myFunction(); Y Lista ejemplo = new ArrayList (); ejemplo.get (0) .myFunction(); Utilicé estos códigos pero ERROR: no se puede encontrar el símbolo símbolo: method myFunction(); – mypolat

+0

debe ser 'List ();' cuando obtiene el objeto como 'example.get (0)' necesita hacer una conversión explícita. ¿Qué clase implementa el método myFunction()? Si 'Employee' implementa' myFunction() 'debe hacer algo como' ((Employee) (example.get (0))). MyFunction(); ', con esto está indicando que el objeto recuperado de la posición 0 puede ser manejado como un empleado. Por supuesto, si no es una excepción, se lanzará. –

+0

clase apple { precio int; public void myFunction (int iPrice) { price = iPrice; } } clase naranja { precio int; public void myFunction (int iPrice) { price = iPrice; }} public class principales {public void main (String [] args) {estáticas listado = new ArrayList <>(); // crear 3 apple object para listar list.add (new apple()); list.add (new apple()); list.add (new orange()); list.get (0)./* "obtener (0)". esto no está de acuerdo al objeto de manzana y mi función */ }} – mypolat

8
List<Object> objects = new ArrayList<Object>(); 

objects aceptará cualquiera de los Object

Se podría diseñar como de la siguiente

public class BaseEmployee{/* stuffs */} 

public class RegularEmployee extends BaseEmployee{/* stuffs */} 

public class Contractors extends BaseEmployee{/* stuffs */} 

y en la lista

List<? extends BaseEmployee> employeeList = new ArrayList<? extends BaseEmployee>(); 
+0

Se desaconseja el uso de tipos crudos . La Especificación del lenguaje Java incluso establece que es posible que las versiones futuras del lenguaje de programación Java no permitan el uso de tipos sin formato. Además, el uso de extensiones evitaría agregar elementos a la lista, como parece sugerir la pregunta. –

+0

¿Qué tipo sin procesar? –

+0

'List' y' ArrayList' son [tipos crudos] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8), ¿no? La sección 4.8 de JLS dice: "El uso de tipos crudos se permite solo como una concesión a la compatibilidad del código heredado. El uso de tipos crudos en el código escrito después de la introducción de genéricos en el lenguaje de programación Java se desaconseja fuertemente **. Es posible __que las versiones futuras del lenguaje de programación Java no permitan el uso de tipos crudos__ " –

0

Si no puede ser más específico que Object con sus instancias, a continuación, utilizar:

List<Object> employees = new ArrayList<Object>(); 

De lo contrario, sea tan específico como sea posible:

List<? extends SpecificType> employees = new ArrayList<? extends SpecificType>(); 
+0

Retrocediendo en el tiempo, ¿eh? –

1

List anyObject = new ArrayList();

or

List<Object> anyObject = new ArrayList<Object>();

ahora anyObject puede contener objects of any type.

use instanciade para saber what kind of object it is.

0

Creo que su mejor tiro es declarar la lista como una lista de objetos:

List<Object> anything = new ArrayList<Object>(); 

A continuación, puede poner lo que quiera en ella, como:

anything.add(new Employee(..)) 

Evidentemente, se quiere no podrá leer nada de la lista sin una conversión adecuada:

Employee mike = (Employee) anything.get(0); 

No recomendaría el uso de tipos de crudos como:

legado
List anything = new ArrayList() 

Dado que todo el propósito de los genéricos es precisamente para evitarlos en el futuro de Java ya no puede suport tipos primas, los tipos primas se consideran y una vez que se utiliza un tipo de prima que está no se permite el uso de genéricos en absoluto en una referencia dada.Por ejemplo, miren esta una otra pregunta: Combining Raw Types and Generic Methods

0

How can I create a list without defining a class type? (<Employee>)

Si estoy leyendo esto correctamente, lo que desea es evitar tener que especificar el tipo, ¿verdad?

En Java 7, se puede hacer

List<Employee> list = new ArrayList<>(); 

pero cualquiera de las otras alternativas que se discuten son sólo va a sacrificar la seguridad de tipos.

Cuestiones relacionadas