2009-05-25 2 views
13

Ну, у меня есть класс Customer (нет базового класса).Как создавать общие типы списков в java?

Мне нужно бросить из LinkedList в список. Есть ли какой-либо чистый способ сделать это?

Просто, чтобы вы знали, мне нужно отдать его в список. Другого типа не будет. (Я разрабатываю тестовое оборудование с использованием Slim и FitNesse).

EDIT: Хорошо, мне нужно привести примеры кода здесь.

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; 
    } 
} 

Так что в соответствии с замечаниями Юваля А, я, наконец, написал код таким образом. Но я получаю эту ошибку:

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 

Итак, каков правильный способ сделать это?

+0

вы должны давшими примеры кода с самого начала , Я обновляю свой ответ за секунду ... –

ответ

25

Вам не нужно бросать. LinkedList реализует List, так что у вас нет заклинаний, чтобы сделать здесь.

Даже если вы хотите вниз литье под давлением до List из Object с вы можете сделать это с дженериков, как в следующем коде:

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

Теперь, после редактирования я понимаю, что вы пытаетесь сделать , и это то, что не представляется возможным, без создания нового List как так:

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

, и я объясню, почему это не возможно в противном случае. Рассмотрим это:

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??? 

Для получения дополнительной информации см Sun Java generics tutorial. Надеюсь, это прояснится.

+0

Вы пропустили мою мысль. Рассмотрим: [code] LinkedList ll = someList; Список l = ll [/ code]. Это нормально? Я имею в виду это. – jrharshath

+0

Сделал то, что вы сказали, но проблема сохраняется. Отредактировал вопрос, чтобы добавить пример кода и возникшую ошибку. – jrharshath

+0

Хорошо, понял. Большое спасибо :) – jrharshath

0

LinkedList реализует список, так что вы можете реализовать

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

Или вы хотите, чтобы отливать из LinkedList < String> в список < Int>? в этом случае вам нужно выбрать каждый элемент и преобразовать его в целое.

+0

Я хочу конвертировать из LinkedList в список . Это (я думал) должен быть автоматическим, coz LinkedList IS_A List и String IS_A Object. Но сегодня я узнал, что это не так. :( – jrharshath

-1

Список - это интерфейс, LinkedList - это конкретная реализация этого интерфейса. Значительная часть времени неявного броска будет работать, назначить LinkedList в List или передать его функции, ожидающей List, и она должна просто «работать».

При необходимости может быть сделано явное литье.

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

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

явное приведение не обязательно. –

+2

это не обязательно – Joset

+3

-1 потому что это не идея интерфейса –

1
> public List<Object> getList() 

Почему вы возвращение список < объекта >? Вы могли бы также вернуться список (без дженерик), так что эквивалентно, но сделает следующий код работу:

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

public List getList() { 
    return theList; 
} 

Casting между списками с различными родовыми типами сложно, и кажется ненужной здесь.

Конечно, вы должны возвращаться Тип списка < Клиент > ...

0

Вы должны вернуть List<?> из метода. Интуитивно, getList() возвращает список, чтобы вызывающий мог получить элементы внутри. List<?> (что эквивалентно List<? extends Object>) позволяет эту функциональность. Однако вы не сможете вставить что-либо в него через возвращаемый список, потому что это не будет безопасным по типу; но я не думаю, что это то, что вам нужно.

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

Вот мое ужасное решение для литья. Я знаю, я знаю, что я не должен выпускать что-то вроде этого в дикую природу, но он пришел в удобном для литья любого объекта любого типа:

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; 
    } 

} 

Использование:

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

сейчас Я буду молиться богам программирования за мои грехи ...

0

просто положить

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

Я сделал эту функцию для того, некрасивым, но это работает

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

и 'clazz' для чего? – nachokk

0

Если ваш список родового типа для например

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

затем После метод должен работать

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>(); 
} 

Как использовать?

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

как я уже говорил, прежде чем он будет работать, если объект содержит общий список, это не будет работать, если вы передаете, не общий список со смешанным типом элементов

Смежные вопросы