2013-07-24 35 views
43

Tôi muốn viết một phương pháp mà sẽ trả về một java.util.List của bất kỳ loại mà không cần phải định kiểu gì:Làm thế nào để có phương thức Java trả về danh sách chung của bất kỳ loại nào?

List<User> users = magicalListGetter(User.class); 

List<Vehicle> vehicles = magicalListGetter(Vehicle.class); 

List<String> strings = magicalListGetter(String.class); 

chữ ký phương pháp sẽ trông như thế nào? Một cái gì đó như thế này, có lẽ (?):

public List<<?> ?> magicalListGetter(Class<?> clazz) { 
    List<?> list = doMagicalVooDooHere(); 

    return list; 
} 

Cảm ơn bạn trước!

+2

Bạn có muốn danh sách để được dân cư thông qua phản ánh? Nếu không, chỉ cần sử dụng 'new ArrayList <>()'. –

Trả lời

83
private Object actuallyT; 

public <T> List<T> magicalListGetter(Class<T> klazz) { 
    List<T> list = new ArrayList<>(); 
    list.add(klazz.cast(actuallyT)); 
    try { 
     list.add(klazz.getConstructor().newInstance()); // If default constructor 
    } ... 
    return list; 
} 

Người ta cũng có thể cung cấp thông số kiểu chung cho một phương pháp. Bạn đã suy luận chính xác rằng một trong những nhu cầu trường hợp lớp học chính xác, để tạo ra những thứ (klazz.getConstructor().newInstance()).

1

Bạn có thể sử dụng theo cách cũ:

public List magicalListGetter() { 
    List list = doMagicalVooDooHere(); 

    return list; 
} 

hoặc bạn có thể sử dụng Object và lớp cha của tất cả mọi thứ:

public List<Object> magicalListGetter() { 
    List<Object> list = doMagicalVooDooHere(); 

    return list; 
} 

Note Có lẽ đó là một lớp cha mẹ tốt hơn cho tất cả các các đối tượng bạn sẽ đưa vào danh sách. Ví dụ: Number sẽ cho phép bạn đặt DoubleInteger trong đó.

1

Something như thế này

publiс <T> List<T> magicalListGetter(Class<T> clazz) { 
    List list = doMagicalVooDooHere(); 
    return list; 
} 
+1

tại sao vượt qua 'clazz' nếu bạn không sử dụng? – newacct

+1

nó giống như thế này trong câu hỏi, có lẽ OP sẽ sử dụng nó bằng cách nào đó –

-1

Tôi khá chắc chắn rằng bạn hoàn toàn có thể xóa các < thứ >, mà sẽ tạo ra một cảnh báo và bạn có thể sử dụng một, @ ngăn chặn cảnh báo. Nếu bạn thực sự muốn nó là chung chung, nhưng để sử dụng bất kỳ phần tử nào của nó, bạn sẽ phải thực hiện nhập kiểu. Ví dụ, tôi đã thực hiện một chức năng sắp xếp bong bóng đơn giản và nó sử dụng một loại chung khi sắp xếp danh sách, mà thực sự là một mảng của Comparable trong trường hợp này. Nếu bạn muốn sử dụng một mục, hãy làm như sau: System.out.println ((Double) arrayOfDoubles [0] + (Double) arrayOfDoubles [1]); vì tôi nhồi đôi (s) vào tương đương (s) là đa hình vì tất cả các đôi (s) kế thừa từ tương đương để cho phép dễ dàng sắp xếp thông qua Collections.sort()

 //INDENT TO DISPLAY CODE ON STACK-OVERFLOW 
@SuppressWarnings("unchecked") 
public static void simpleBubbleSort_ascending(@SuppressWarnings("rawtypes") Comparable[] arrayOfDoubles) 
{ 
//VARS 
    //looping 
    int end  =  arrayOfDoubles.length - 1;//the last index in our loops 
    int iterationsMax = arrayOfDoubles.length - 1; 

    //swapping 
    @SuppressWarnings("rawtypes") 
    Comparable tempSwap = 0.0;//a temporary double used in the swap process 
    int elementP1 = 1;//element + 1, an index for comparing and swapping 


//CODE 
    //do up to 'iterationsMax' many iterations 
    for (int iteration = 0; iteration < iterationsMax; iteration++) 
    { 
     //go through each element and compare it to the next element 
     for (int element = 0; element < end; element++) 
     { 
      elementP1 = element + 1; 

      //if the elements need to be swapped, swap them 
      if (arrayOfDoubles[element].compareTo(arrayOfDoubles[elementP1])==1) 
      { 
       //swap 
       tempSwap = arrayOfDoubles[element]; 
       arrayOfDoubles[element] = arrayOfDoubles[elementP1]; 
       arrayOfDoubles[elementP1] = tempSwap; 
      } 
     } 
    } 
}//END public static void simpleBubbleSort_ascending(double[] arrayOfDoubles) 
16

Không cần phải thậm chí vượt qua lớp:

public <T> List<T> magicalListGetter() { 
    return new ArrayList<T>(); 
} 
+2

Tôi nghĩ rằng bạn cần phải vượt qua một lớp học khi bạn muốn thêm các mục. – zygimantus

1

tùy chọn khác là cách làm như sau:

public class UserList extends List<User>{ 

} 

public <T> T magicalListGetter(Class<T> clazz) { 
    List<?> list = doMagicalVooDooHere(); 
    return (T)list; 
} 

List<User> users = magicalListGetter(UserList.class); 

'

2

chúng ta có List<Object> objectList mà chúng tôi muốn truyền tới List<T>

public <T> List<T> list(Class<T> c, List<Object> objectList){   
    List<T> list = new ArrayList<>();  
    for (Object o : objectList){ 
     T t = c.cast(o); 
     list.add(t); 
    } 
    return list; 
} 
0

Bạn chỉ có thể cast vào danh sách và sau đó kiểm tra nếu mọi phần tử có thể được đúc để T.

public <T> List<T> asList(final Class<T> clazz) { 
    List<T> values = (List<T>) this.value; 
    values.forEach(clazz::cast); 
    return values; 
} 
Các vấn đề liên quan