使用另一个Generic扩展通用集合

时间:2014-08-12 13:21:21

标签: java generics

我需要创建自己的PriorityBlockingQueue<Runnable>

实现

使用扩展MyRunnableInterface的我自己的界面Runnable,我看到了两个选项:

1 - class MyQueue<T extends MyRunnableInterface> extends PriorityBlockingQueue<T>

2 - class MyQueue extends PriorityBlockingQueue<MyRunnableInterface>

使用选项1,使用构造函数new MyQueue<MyRunnableInterface>我收到错误:类型不匹配:无法从MyQueue转换为BlockingQueue

使用选项1,使用构造函数new MyQueue我收到警告: MyQueue是原始类型。对泛型类型MyQueue的引用应该参数化

使用选项2,使用构造函数new MyQueue我收到错误:类型不匹配:无法从MyQueue转换为BlockingQueue

事情是,我希望能够引用我创建的MyQueue对象,调用一个方法,该方法接受Typed参数MyRunnableInterface而不必每次都进行类型转换(从T开始)

我想我在Generics的细微之处遗漏了一些东西?

public class MyQueue<T extends MyQueue.MyRunnableInterface>
extends PriorityBlockingQueue<T> {

public interface MyRunnableInterface extends Runnable {

}

public int test( final MyRunnableInterface r ) {
    return 0;
}

private static BlockingQueue<Runnable> create() {
    return new MyQueue<MyRunnableInterface>(); //Error Here
}

private static BlockingQueue<Runnable> create2() {
    return new MyQueue(); //Warning Here
}

public static void main(final String[] args) {
    final BlockingQueue<Runnable> r = create();
    ((MyQueue) r).test(null);
}

}

上面添加了更多代码....猜猜我只需要接受警告吗?

2 个答案:

答案 0 :(得分:2)

public class MyQueue<T extends Runnable> extends PriorityBlockingQueue<T> {

    public interface MyRunnableInterface extends Runnable {

    }

    public static void main(String[] args) {
        final BlockingQueue<MyRunnableInterface> myRunnableInterfaces = new MyQueue<MyQueue.MyRunnableInterface>();
    }
}

适合我...

答案 1 :(得分:1)

使用更新的代码,您将收到错误,因为泛型类型不同(相关,但编译器不关心)。您可以进行通配符匹配:

private static BlockingQueue<? extends Runnable> create() {
    return new MyQueue<MyRunnableInterface>(); //Now no error and no warning
}