2012-06-17 37 views

Trả lời

13

Bạn có thể tạo danh sách đối tượng như List<Object> list = new ArrayList<Object>(). Như tất cả thực hiện các lớp học kéo dài ngầm hay rõ ràng từ java.lang.Object lớp, danh sách này có thể chứa bất kỳ đối tượng, trong đó có trường hợp của Employee, Integer, String, vv

Khi bạn lấy một phần tử từ danh sách này, bạn sẽ được lấy một Object và không còn là một Employee, có nghĩa là bạn cần phải thực hiện một diễn viên rõ ràng trong trường hợp này như sau:

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

Danh sách ví dụ = new ArrayList <>(); example.get (0) .myFunction(); VÀ Danh sách ví dụ = new ArrayList (); example.get (0) .myFunction(); Tôi đã sử dụng các mã này nhưng L ERI: không thể tìm thấy biểu tượng biểu tượng: phương thức myFunction(); – mypolat

+0

nó phải là 'Danh sách ();' khi bạn nhận được đối tượng như 'example.get (0)' bạn cần tạo một dàn diễn viên rõ ràng. Lớp nào triển khai phương thức myFunction()? Nếu 'Employee' thực hiện' myFunction() ', bạn nên làm một cái gì đó như' ((Employee) (example.get (0))). MyFunction(); ', với điều này bạn chỉ ra rằng đối tượng được lấy từ vị trí 0 có thể là xử lý như một nhân viên. Tất nhiên nếu nó không phải là một ngoại lệ sẽ được ném. –

+0

táo hạng { giá int; public void myFunction (int iPrice) { giá = iPrice; } } lớp màu cam { giá int; public void myFunction (int iPrice) { giá = iPrice; } } chính lớp công khai { chính trống công cộng (Chuỗi [] args) { Danh sách danh sách = new ArrayList <>(); // tạo 3 đối tượng táo vào danh sách list.add (new apple()); list.add (new apple()); list.add (new orange()); list.get (0)./* "get (0)." điều này không sử dụng đối tượng táo và chức năng của tôi */ } } – mypolat

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

objects danh sách sẽ chấp nhận bất kỳ Object

Bạn có thể thiết kế như như sau

public class BaseEmployee{/* stuffs */} 

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

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

và trong danh sách

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

Sử dụng các loại thô không được khuyến khích . Đặc tả Ngôn ngữ Java thậm chí nói rằng có thể các phiên bản tương lai của ngôn ngữ lập trình Java sẽ không cho phép sử dụng các kiểu thô. Ngoài ra, việc sử dụng mở rộng sẽ ngăn không cho thêm các phần tử vào danh sách, vì câu hỏi dường như đề xuất. –

+0

Loại thô nào? –

+0

'Danh sách' và' ArrayList' là [loại thô] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8), phải không? Phần JLS 4.8 cho biết: "Việc sử dụng các kiểu thô chỉ được phép sử dụng như một sự nhượng bộ cho khả năng tương thích của mã kế thừa. Việc sử dụng các kiểu thô trong mã được viết sau khi giới thiệu Generics vào ngôn ngữ lập trình Java là ** nản chí **. Có thể __that các phiên bản tương lai của ngôn ngữ lập trình Java sẽ không cho phép sử dụng các kiểu raw__ " –

0

Nếu bạn không thể cụ thể hơn so Object với trường hợp của bạn, sau đó sử dụng:

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

Nếu không, hãy nêu cụ thể như bạn có thể:

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

Quay ngược thời gian, huh! –

1

List anyObject = new ArrayList();

or

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

tại anyObject thể giữ objects of any type.

sử dụng instanceof để biết what kind of object it is.

0

Tôi tin rằng bức ảnh đẹp nhất của bạn là để công bố danh sách như một danh sách các đối tượng:

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

Sau đó, bạn có thể đặt bất cứ điều gì bạn muốn trong nó, như:

anything.add(new Employee(..)) 

Rõ ràng, bạn sẽ không thể đọc bất kỳ điều gì ngoài danh sách mà không có cách truyền thích hợp:

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

Tôi sẽ không khuyến khích sử dụng các loại nguyên liệu như:

List anything = new ArrayList() 

Kể từ khi toàn bộ mục đích của Generics là chính xác để tránh chúng, trong thời gian tới Java có thể không còn suport loại thô, các loại nguyên liệu được coi là di sản và một khi bạn sử dụng một loại nguyên liệu bạn không được phép sử dụng generics ở tất cả trong một tham chiếu nhất định.Ví dụ, hãy xem xét một một câu hỏi này: Combining Raw Types and Generic Methods

0

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

Nếu tôi đọc sách này một cách chính xác, bạn chỉ muốn tránh phải ghi rõ chủng loại, đúng không?

Trong Java 7, bạn có thể làm

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

nhưng bất kỳ lựa chọn thay thế khác được thảo luận chỉ là sẽ hy sinh an toàn kiểu.

Các vấn đề liên quan