2012-07-13 61 views
2

我想实例化一个新的Java ThreadPoolExecutor与这段代码:泛型结构:Java不承认,我自己的类实现一个接口

public class ImageList { 
    private LinkedBlockingQueue<Image> list; 
    private final ThreadPoolExecutor executor; 

    public ImageList() { 
     executor = new ThreadPoolExecutor(2, 4, 100, TimeUnit.SECONDS, list); 
    } 
} 

Image具有以下标题:

public class Image implements Runnable, Serializable 

但是,Java抱怨没有找到类型BlockingQueue<Runnable>的构造函数。我究竟做错了什么?

+1

泛型中的继承与类中的继承稍有不同。您需要使用通配符http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html – kosa 2012-07-13 14:52:31

+0

泛型和多态:http://stackoverflow.com/questions/2745265/is-listdog-a-subclass -of-listanimal-why-arent-javas-generics-implicit – assylias 2012-07-13 14:56:41

回答

4

构造函数期望BlockingQueue<Runnable>。你通过它BlockingQueue<Image>

A BlockingQueue<Image>不是BlockingQueue<Runnable>。事实上,您可以在BlockingQueue<Runnable>中存储任何类型的Runnable,但您只能在BlockingQueue<Image>中存储Image实例。

如果是这样,你可以做到以下几点:

BlockingQueue<Image> list = new BlockingQueue<Image>(); 
BlockingQueue<Runnable> list2 = list1; 
list2.add(new Runnable() {...}); 

和繁荣!您的BlockingQueue<Image>将包含Image以外的内容。

+0

难道你不能做'BlockingQueue <?扩展Runnable>'? – jn1kk 2012-07-13 15:42:30

+1

否。线程池需要一个BlockingQueue ,以便能够存储它在队列中创建的Runnable实例。 BlockingQueue的<?扩展Runnable>意味着:一些未知子类的BlockingQueue,它是或扩展了Runnable。你不能将任何东西存储到这样的队列中。 – 2012-07-13 16:58:17

+0

不是'Image'实现(“扩展”)'Runnable'虽然?所以你可以把'Image'放入'BlockingQueue <?扩展Runnable>',还是我错了(或误解OP的问题)? – jn1kk 2012-07-13 17:25:13

相关问题