2010-11-24 2 views
0

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

Для основной функции у меня это есть. В основном у меня есть инвентарь запасов строк, и я хочу купить этот инвентарь инвентаризации строк в набор объектов. Однако я получаю эту ошибку.

добавить (захват # 880?) В java.util.Collection не может быть применен к (Т)

import java.util.*; 

public class lab6 { 

    public static void main(String[] args) { 
    Shop<String> turkey= new Shop<String>(); 
    turkey.sell("pork"); 
    turkey.sell("chicken"); 
    turkey.print(); 
    Set<Object> possessions= new HashSet<Object>(); 
    turkey.buy(2,possessions); 
     for(String e:possessions) 
     System.out.println(e); 

    } 
} 

Тогда это файл класса.

import java.util.*; 

    public class Shop<T> { 

    List<T> stock; 

    public Shop() { stock = new LinkedList<T>(); } 
    public T buy() { 
     return stock.remove(0); 
    } 

    void sell(T item) { 
     stock.add(item); 
    } 

    void buy(int n, Collection<?> items) { 

     for (T e : stock.subList(0, n)) { 
      items.add(e); 
     } 
     for (int i=0; i<n; ++i) stock.remove(0); 

    } 
} 

ответ

0

Замените метод buy с этим:

void buy(int n, Collection<T> items) { 

    for (T e : stock.subList(0, n)) { 
     items.add(e); 
    } 
    for (int i=0; i<n; ++i) stock.remove(0); 

} 

Вы использовали Collection<?>

EDIT:

изменить Также ваш главный к этому:

public static void main(final String[] args) { 
    final Shop<String> turkey = new Shop<String>(); 
    turkey.sell("pork"); 
    turkey.sell("chicken"); 
    turkey.print(); 
    final Set<String> possessions = new HashSet<String>(); 
    turkey.buy(2, possessions); 
    for (final String e : possessions) { 
     System.out.println(e); 
    } 
} 

и напишите код print() в магазине.

+0

Вы уверены, что это то, что он хочет? Он пропускает Set , чтобы купить, а T - это строка в этом случае. – Falmarri 2010-11-24 00:40:25

+0

Хм, я могу ошибаться. Позвольте мне подумать об этом. – 2010-11-24 00:41:13

0

Проблема заключается в том, что Collection<?> может содержать любые типы объектов, а T не может быть подтипом типа ?. Например, вы можете передать Collection<Integer>, и если T - String, очевидно, вы не можете сделать items.add(e).

Вы должны убедиться, что Collection держит надтипа T так, что она всегда действует добавить T, поэтому попробовать что-то вроде:

void buy(int n, Collection<? super T> items)