2013-02-03 68 views
5

Tôi có một số Object đôi khi chứa một số List<Object>. Tôi muốn kiểm tra nó với instanceof và nếu có, hãy thêm một số yếu tố vào nó.Kiểm tra xem đối tượng có phải là ví dụ của Danh sách <Object>

void add(Object toAdd) { 
    Object obj = getValue(); 
    if (obj instanceof List<?>) { 
     List<?> list = obj; 
     if (list instanceof List<Object>) { // Error 
      ((List<Object>) list).add(toAdd); 
     } else { 
      List<Object> newList = new ArrayList<Object>(list); 
      newList.add(toAdd); 
      setValue(newList); 
     } 
     return; 
    } 
    throw new SomeException(); 
} 

Và nó nói tôi không thể kiểm tra nếu nó là instanceof List<Object> vì java không quan tâm và xóa các loại trong <>. Điều này có nghĩa là tôi phải tạo ArrayList mới mỗi lần? Hoặc có cách nào để kiểm tra điều đó, vd. với sự phản ánh?

+2

Đoạn mã này phải làm gì? – poitroae

+2

Nó được gọi là loại xóa trong Java http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens –

+0

@Michael này sẽ là một wrapper quanh snakeyaml. Nếu tôi có một danh sách trong yaml, nó sẽ phân tích nó thành một số danh sách trong Java. Nếu tôi muốn thêm một phần tử vào danh sách này, tôi cần biết loại danh sách đó là gì. Đó là lý do tại sao tôi tạo một ArrayList mới của kiểu đã biết và thêm tất cả các phần tử cũ vào nó, cộng với một phần tử mới. Sau đó, tôi thay thế danh sách cũ bằng danh sách mới và khi tôi gọi snakeyaml để chuyển đổi nó thành yaml, phần tử được thêm của tôi sẽ có ở đó. – Wolf480pl

Trả lời

3

Tôi đã sai trong câu trả lời trước của mình vì tôi chưa hiểu đầy đủ các yêu cầu của bạn. nếu mục được thêm vào của bạn là một đối tượng bạn có thể thêm nó mà không có bất kỳ vấn đề nào miễn là bạn có danh sách thứ gì đó. Bạn không cần phải tái tạo danh sách

void add(Object toAdd) { 
    Object obj = getObject(); 
    if (obj instanceof List<?>) { 
     ((List<Object>)obj).add(toAdd); 
     return; 
    } 
    throw new SomeException(); 
} 

CẬP NHẬT

như câu trả lời cho vài ý kiến, không có vấn đề để thêm bất kỳ đối tượng vào một danh sách, và không có vấn đề để tìm hiểu loại đối tượng trong thời gian lặp lại sau khi nó:

List<String> x1 = new ArrayList<String>(); 
Object c3 = x1; 
x1.add("asdsad"); 
Integer y2 = new Integer(5); 
if (c3 instanceof List<?>){ 
    ((List<Object>)c3).add((Object)y2); 
} 

for (Object i : (List<Object>)c3){ 
    if (i instanceof String){ 
     System.out.println("String: " + (String)i); 
    } 
    if (i instanceof Integer){ 
     System.out.println("Integer: "+ (Integer)i); 
    } 
} 
+0

Tôi muốn đảm bảo tham số không phải là một phân lớp của đối tượng. Sẽ getActualTypeArguments() == Object.class làm việc? – Wolf480pl

+0

Ngoài ra, điều này sẽ nhanh hơn sao chép <50 phần tử ArrayList? – Wolf480pl

+1

Điều này hoàn toàn sai. Điều này chỉ dành cho nếu lớp của đối tượng là một lớp con của ArrayList hoặc một cái gì đó, và nó mở rộng nó với một tham số kiểu cụ thể. Không ai trong số đó là những gì OP đang làm. – newacct

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