我需要创建自己的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);
}
}
上面添加了更多代码....猜猜我只需要接受警告吗?
答案 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
}