2009-05-25 25 views
13

Vâng, tôi có một lớp Khách hàng (không có lớp cơ sở).Làm thế nào để đúc các loại danh sách chung trong java?

Tôi cần truyền từ LinkedList vào Danh sách. Có cách nào sạch sẽ để làm điều này không?

Để bạn biết, tôi cần truyền nó vào Danh sách. Không có loại nào khác sẽ làm. (Tôi đang phát triển một thử nghiệm thử nghiệm bằng cách sử dụng Slim và FitNesse).


EDIT: OK, tôi nghĩ tôi cần đưa ra ví dụ về mã tại đây.

import java.util.*; 
public class CustomerCollection 
{ 
    protected LinkedList<Customer> theList; 

    public CustomerCollection() 
    { 
     theList = new LinkedList<Customer>(); 
    } 

    public void addCustomer(Customer c){ theList.add(c); } 
    public List<Object> getList() 
    { 
     return (List<? extends Object>) theList; 
    } 
} 

Vì vậy, theo nhận xét của Yuval A, cuối cùng tôi đã viết mã theo cách này. Nhưng tôi nhận được lỗi này:

CustomerCollection.java:31: incompatible types 
found : java.util.List<capture#824 of ? extends java.lang.Object> 
required: java.util.List<java.lang.Object> 
     return (List<? extends Object>)theList; 
      ^
1 error 

Vì vậy, cách chính xác để làm việc này là gì?

+0

bạn nên đã đưa ra các ví dụ mã từ khi bắt đầu , Tôi sẽ cập nhật câu trả lời của tôi trong một giây ... –

Trả lời

25

Bạn không cần phải truyền. LinkedList thực hiện List để bạn không có cách truyền nào để làm ở đây.

Ngay cả khi bạn muốn down-cast vào một List của Object s bạn có thể làm điều đó với Generics như trong đoạn mã sau:

LinkedList<E> ll = someList; 
List<? extends Object> l = ll; // perfectly fine, no casting needed 

Bây giờ, sau khi chỉnh sửa của bạn tôi hiểu những gì bạn đang cố gắng làm , và nó là cái gì đó không phải là tốt, mà không tạo ra một mới List như vậy:

LinkedList<E> ll = someList; 
List<Object> l = new LinkedList<Object>(); 
for (E e : ll) { 
    l.add((Object) e); // need to cast each object specifically 
} 

và tôi sẽ giải thích tại sao điều này là không thể khác. Hãy xem xét điều này:

LinkedList<String> ll = new LinkedList<String>(); 
List<Object> l = ll; // ERROR, but suppose this was possible 
l.add((Object) new Integer(5)); // now what? How is an int a String??? 

Để biết thêm thông tin, hãy xem Sun Java generics tutorial. Hy vọng điều này làm rõ.

+0

Bạn đã bỏ lỡ quan điểm của tôi. Hãy xem xét: [code] LinkedList ll = someList; Danh sách l = ll [/ code]. Điều này có được không? Ý tôi là. – jrharshath

+0

Đã làm những gì bạn nói, nhưng vấn đề vẫn tồn tại. Đã chỉnh sửa câu hỏi để thêm ví dụ về mã và gặp lỗi. – jrharshath

+0

Được rồi, hiểu rồi. Cảm ơn rất nhiều :) – jrharshath

0

LinkedList thực hiện Danh sách, vì vậy bạn có thể thực hiện

List<String> list1 = new LinkedList<String>(); 

Hay bạn muốn đúc từ LinkedList < String> vào danh sách < int>? trong trường hợp này, bạn phải chọn từng phần tử và chuyển đổi nó thành một số nguyên.

+0

Tôi muốn chuyển đổi từ LinkedList thành Danh sách . Điều đó (tôi từng nghĩ) nên tự động, coz LinkedList IS_A List, và String IS_A Object. Nhưng tôi phát hiện ra ngày hôm nay rằng nó không phải là. :( – jrharshath

-1

Danh sách là một giao diện, LinkedList là một triển khai cụ thể của giao diện đó. Phần lớn thời gian một diễn viên tiềm ẩn sẽ hoạt động, gán một LinkedList vào một Danh sách, hoặc chuyển nó tới một hàm mong đợi một Danh sách và nó sẽ chỉ hoạt động.

Một diễn viên rõ ràng cũng có thể được thực hiện nếu cần.

//This is valid 
List<Customer> myList = new LinkedList<Customer>(); 

//Also Valid 
List<Customer> myList = (List<Customer>) new LinkedList<Customer>(); 
+2

một diễn viên rõ ràng là không cần thiết –

+2

điều này là không cần thiết – Joset

+3

-1 bởi vì đây không phải là ý tưởng của một giao diện –

1
> public List<Object> getList() 

Tại sao cậu lại trở Danh sách <Object>? Bạn cũng có thể trở lại Danh sách (không có Generics) vì đó là tương đương nhưng sẽ làm cho công việc mã sau:

LinkedList<Customer> theList = new LinkedList<Customer>(); 

public List getList() { 
    return theList; 
} 

Đúc giữa Lists với các kiểu generic khác nhau là khó khăn và dường như không cần thiết ở đây.

Tất nhiên bạn nên trở về loại List < khách hàng > ...

0

Bạn nên trả lại một List<?> từ phương pháp của bạn. Trực giác, getList() trả về một danh sách để người gọi có thể truy xuất các mục bên trong. List<?> (tương đương với List<? extends Object>) cho phép chức năng đó. Tuy nhiên, bạn sẽ không thể đặt bất cứ điều gì vào nó thông qua danh sách trả về, bởi vì điều đó sẽ không được an toàn; nhưng tôi không nghĩ đó là những gì bạn cần.

public List<?> getList() 
{ 
    return theList; 
} 
17

Đây là giải pháp khủng khiếp của tôi khi thực hiện truyền. Tôi biết, tôi biết, tôi không nên phát hành một cái gì đó như thế này vào môi trường tự nhiên, nhưng nó đã có ích cho bất kỳ đối tượng đúc cho bất kỳ loại:

public class UnsafeCastUtil { 

    private UnsafeCastUtil(){ /* not instatiable */} 

    /** 
    * Warning! Using this method is a sin against the gods of programming! 
    */ 
    @SuppressWarnings("unchecked") 
    public static <T> T cast(Object o){ 
     return (T)o; 
    } 

} 

Cách sử dụng:

Cat c = new Cat(); 
Dog d = UnsafeCastUtil.cast(c); 

Bây giờ tôi sẽ cầu nguyện với các vị thần của chương trình vì tội lỗi của tôi ...

0

chỉ cần đặt

public static List<Object> getList() { 
    List l = test; 
    return l; 
} 
2

tôi đã làm chức năng này cho rằng, xấu xí nhưng nó hoạt động

public static <T> Collection<T> cast(Collection<? super T> collection, Class<T> clazz){ 
    return (Collection<T>)collection; 
} 
+2

và 'clazz' là dành cho những gì? Không được sử dụng – nachokk

0

Nếu danh sách của bạn là của một loại chung cho ví dụ

ArrayList<String> strList = new ArrayList<String>(); strList.add("String1"); Object o = strList;

sau đó phương pháp sau sẽ làm việc

public <T> List<T> getListObjectInBodyOfType(Class<T> classz, Object body) { 
    if(body instanceof List<?>){ 
     List<?> tempList = (List<?>)body; 
     if(tempList.size() > 0 && tempList.get(0).getClass().equals(classz)){ 
      return (List<T>) body; 
     } 
    } 
    return new ArrayList<T>(); 
} 

Làm thế nào để sử dụng nó?

List<String> strList1 = getListObjectInBodyOfType(String.class, o); 

như tôi đã đề cập trước khi nó hoạt động nếu Object chứa danh sách chung, điều này sẽ không hoạt động nếu bạn vượt qua một danh sách không chung với loại hỗn hợp của các yếu tố

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