2010-11-24 47 views
0

所以我有这个代码。基本上它应该能够获得任何类型的股票,并且您应该能够从该股票中购买任何类型的集合,包括对象。java收藏

对于主要功能,我有这个。基本上我有一个字符串的库存清单,我想购买形成这个库存的字符串到一组对象。但是,我得到这个错误。

在java.util.Collection中添加(捕获#880?)不能适用于(T)

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

编辑:

而且改变你的主这样的:

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

并在Shop中写入print()方法。

+0

你确定这就是他想要什么?他通过Set 购买,在这种情况下T是一个字符串。 – Falmarri 2010-11-24 00:40:25

+0

嗯,我可能是错的。让我考虑一下。 – 2010-11-24 00:41:13

0

这里的问题是Collection<?>可以包含任何类型的对象,并且T可能不是?类型的子类型。例如,您可以通过Collection<Integer>,如果TString,则显然您不能执行items.add(e)

你需要确保的是,Collection持有T的超类型,以便它总是有效,以添加T,所以你可以试试:

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