2012-06-17 25 views
9

Tringuje, aby utworzyć listę tablic różnych instancji klasy. Jak utworzyć listę bez definiowania typu klasy? (<Employee>)Tworzenie listy instancji różnych obiektów

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

Odpowiedz

13

Można by utworzyć listę obiektów, takich jak List<Object> list = new ArrayList<Object>(). Jako realizacja wszystkich klas rozciąga bezpośrednia lub pośrednia z java.lang.Object klasy, lista ta może posiadać żadnych przedmiotów, w tym przypadki Employee, Integer, String itp

Podczas pobierania elementu z tej listy, będzie zdobycie jak Object i nie już metoda Employee, co oznacza, musisz wykonać wyraźny obsady w tym przypadku następująco:

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 example = new ArrayList <>(); przyklad.get (0) .myFunction(); I Lista przykład = nowa ArrayList (); przyklad.get (0) .myFunction(); Użyłem tych kodów, ale BŁĄD: nie można znaleźć symbolu symbol: method myFunction(); – mypolat

+0

powinien to być 'List ();' gdy otrzymasz obiekt typu 'example.get (0)' musisz wykonać rzutowanie jawne. Która klasa implementuje metodę myFunction()? Jeśli 'Pracownik' implementuje' myFunction() 'powinieneś zrobić coś w stylu' ((Pracownik) (example.get (0)). MyFunction(); ', z tym wskazujesz, że obiekt pobrany z pozycji 0 może być traktowany jako pracownik. Oczywiście, jeśli nie jest to wyjątek, zostanie rzucony. –

+0

klasa jabłko { int cena; publiczny void myFunction (int iPrice) { cena = iPrice; } } klasa pomarańczowa { cena int; publiczny void myFunction (int iPrice) { cena = iPrice; } } public class główne { public static void main (String [] args) { Lista list = new ArrayList <>(); // utworzyć 3 obiekt apple do listy list.add (new apple()); list.add (nowe jabłko()); list.add (nowa pomarańczowa()); lista.get (0)./* "get (0)." to nie używa obiektu Apple i mojej funkcji */ } } – mypolat

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

objects lista zaakceptuje żadnej z Object

Można zaprojektować podobny sposób następujący

public class BaseEmployee{/* stuffs */} 

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

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

aw liście

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

Stosowanie surowych typów jest odradzane . Specyfikacja języka Java stwierdza nawet, że możliwe jest, że przyszłe wersje języka programowania Java uniemożliwią stosowanie typów surowych. Ponadto użycie rozszerzeń uniemożliwiłoby dodawanie elementów do listy, ponieważ wydaje się to sugerować. –

+0

Jaki typ surowy? –

+0

'List' i' ArrayList' to [typy surowe] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8), nieprawdaż? Sekcja 4.8 JLS mówi: "Używanie typów surowych jest dozwolone tylko jako koncesja na zgodność starego kodu. Używanie typów surowych w kodzie napisanym po wprowadzeniu generycznych do języka programowania Java jest zdecydowanie ** odradzane **. Możliwe jest, że przyszłe wersje języka programowania Java uniemożliwią użycie typów raw__ " –

0

Jeśli nie można być bardziej szczegółowe niż Object z wystąpień, a następnie użyć:

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

W przeciwnym razie możesz być tak konkretny, jak tylko możesz:

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

Cofnąć się w czasie, huh! –

1

List anyObject = new ArrayList();

or

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

teraz anyObject może pomieścić objects of any type.

użyć instanceof do poznania what kind of object it is.

0

wierzę swój najlepszy strzał jest zadeklarować listę jako listę obiektów:

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

Następnie można umieścić cokolwiek chcesz w nim, jak:

anything.add(new Employee(..)) 

widocznie, pokochasz nie można odczytać niczego z listy bez prawidłowego odlewania:

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

Odradzam korzystanie surowych typów, takich jak:

List anything = new ArrayList() 

Ponieważ cała Celem generycznych jest właśnie ich uniknąć w przyszłości Java nie mogą już suport surowe typy, surowe typy uznawane są za dziedzictwo i raz użyć typ surowej jesteś nie wolno używać generycznych w ogóle w danym źródle.Na przykład, spójrz na to jedno pytanie: Combining Raw Types and Generic Methods

0

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

Jeśli czytam to poprawnie, po prostu chcesz, aby uniknąć konieczności określić typ, prawda?

W Javie 7 można zrobić

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

jednak którykolwiek z pozostałych alternatyw są omówione są tylko zamiar poświęcić typu bezpieczeństwa.