Java 强制参数化类型作为构造函数参数是正确的
我已经在这上面搜索了很长时间,没有什么能真正接近我所需要的 示例代码:Java 强制参数化类型作为构造函数参数是正确的,java,generics,Java,Generics,我已经在这上面搜索了很长时间,没有什么能真正接近我所需要的 示例代码: public class MyQueue<E extends Delayed & Serializable> extends DelayQueue<E> { private Class<E> mClass; public MyQueue(Class<E> type) { super(); mClass = type;
public class MyQueue<E extends Delayed & Serializable> extends DelayQueue<E> {
private Class<E> mClass;
public MyQueue(Class<E> type) {
super();
mClass = type;
}
}
公共类MyQueue扩展了DelayQueue{
私有类mClass;
公共MyQueue(类类型){
超级();
mClass=类型;
}
}
MyQueue的创建方式如下:MyQueue q=newmyqueue(MyObj.class)代码>
我的问题是:如何编写构造函数,使参数“type”是正确的参数化类型“E extends Delayed&Serializable”
我希望我已经解释清楚了
提前感谢您的帮助
编辑:从答案和备注中,我起初无法选择正确的答案。因此,这是我第一次尝试用我最初想要的和我现在得到的来强化我的问题。在原来的帖子中回答了我的发现
显然,我需要知道的是构造时参数化类型E的类。对于Transparency,队列使用E类名(即MyObj)传递到备份存储。经过大量的阅读,我开始明白,我不能在这个信息更容易,因为类型擦除。我被迫将该类不仅作为参数化类型传递,还作为构造函数变量传递
我担心我会意外地调用构造函数(MyObj和OthrObj都实现了Delayed&Serializable):
MyQueue q=newmyqueue(OthrObj.Class);
我更好的问题应该是:如何以这种方式编写构造函数,强制构造函数变量E与参数化类型E匹配?
这样做会更有意义,而且可能更容易理解我所写的内容。从某种意义上说,你们中的大多数人在技术上是正确的,在测试了许多变体之后,我得出结论,我已经这么做了。“对不起,seh和Tnem是完全正确的,他们都值得表扬。”,类型
参数将强制为类型延迟和可序列化
。我看不出这里出了什么问题……我想你想要的是:
public class MyQueue<E extends Delayed & Serializable> extends DelayQueue<E> {
private E mClass;
public MyQueue(E type) {
super();
mClass = type;
}
}
公共类MyQueue扩展了DelayQueue{
私人E-mClass;
公共MyQueue(E类型){
超级();
mClass=类型;
}
}
您已经编写了构造函数,这样参数“type”就属于正确的参数化类型“E extensed Delayed&Serializable”
类定义本身的类型限制
public class MyQueue<E extends Delayed & Serializable> ...
公共类MyQueue。。。
坚持到底。您不会在构造函数定义中重复类型的上限
public MyQueue(Class<E> type) {
公共MyQueue(类类型){
并且它不是必需的。例如,像
MyQueue<Long> myQueue = new MyQueue<Long>(Long.class);
MyQueue MyQueue=newmyqueue(Long.class);
导致编译器错误。-请尝试。public MyQueue(类类型){
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
}
超级();
mClass=类型;
类关联子类(延迟类);
type.asSubclass(Serializable.class);//当不能发生时,这两个都会抛出
}
这会显式地检查传递的类是否正确,即使在记帐类型擦除时也是如此(当不能发生时抛出classcastexception)您能不能简单地将参数指定为类型E?看起来您已经在那里了。如果类型MyObj
不是从Delayed
和Serializable
派生的,那么MyObj
到类型参数E
的绑定将失败。您想要一个类对象作为参数吗?或者您感兴趣吗n类型为E的对象?您能告诉我们您看到的错误消息吗?type
永远不能是类型为E
,因为您在构造函数中没有接收到E
的实例。不,type
在这种情况下是Class
,不是E
,抱歉,这是传递一个E的实例。我需要E的类.
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
}