我一直在寻找这一点,并没有真正接近我需要的东西。
示例代码:
public class MyQueue<E extends Delayed & Serializable> extends DelayQueue<E> {
private Class<E> mClass;
public MyQueue(Class<E> type) {
super();
mClass = type;
}
}
MyQueue的创建方式如下:MyQueue q<MyObj> = new MyQueue<MyObj>(MyObj.class);
。
我的问题:如何以这种方式编写构造函数,参数“type”是正确的参数化类型“E extends Delayed&amp; Serializable”?
我希望我已经解释好了。
提前感谢你的帮助。
修改:从答案和评论中我起初无法选择正确的答案。因此,我第一次尝试用我想要的东西来增强我的问题,以及我现在最终的结果。例如,在原始帖子中回答我发现的内容。
显然我需要知道的是参数化类型E在构造时间上的类。对于透明度,队列使用E类名称(即MyObj)传递给后备存储。经过大量的阅读后,我逐渐明白,由于类型擦除,我无法更容易获得这些信息。我不得不将该类不仅作为参数化类型传递,还作为构造函数传递。
我担心我偶然会这样调用构造函数(MyObj和OthrObj都实现了Delayed&amp; Serializable):
MyQueue q<MyObj> = new MyQueue<MyObj>(OthrObj.Class);
我的更好的问题应该是: 如何以这种方式编写构造函数,强制构造函数变量E与参数化类型E匹配?
它本来会更有意义,它可能更容易理解我所写的内容。从技术上讲,大多数人在某种意义上都是正确的,在测试了很多变化之后,我得出了我已经做过的结论 giggles抱歉 seh和Tnem完全正确并且都值得学分。< / p>
答案 0 :(得分:5)
您所编写的内容是您指定的内容,type
参数将被强制为Delayed & Serializable
类型。我不明白这里有什么不对......
答案 1 :(得分:3)
您已经已经以这种方式编写了构造函数,参数“type”具有正确的参数化类型“E extends Delayed&amp; Serializable”'。
类定义本身的类型限制
public class MyQueue<E extends Delayed & Serializable> ...
继续。您不要在构造函数定义
中重复该类型的上限public MyQueue(Class<E> type) {
并没有必要。例如。像
这样的实例化MyQueue<Long> myQueue = new MyQueue<Long>(Long.class);
导致编译器错误。 - 试试吧。
答案 2 :(得分:1)
我认为你想要的是:
public class MyQueue<E extends Delayed & Serializable> extends DelayQueue<E> {
private E mClass;
public MyQueue(E type) {
super();
mClass = type;
}
}
答案 3 :(得分:0)
public MyQueue(Class<E> type) {
super();
mClass = type;
type.asSubclass(Delayed.class);
type.asSubclass(Serializable.class);//both of these throw when it can't happen
}
这显式检查传递的类是否正确,即使在会计类型擦除时(并且当它不能发生时抛出classcastexception)