Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制参数化类型作为构造函数参数是正确的_Java_Generics - Fatal编程技术网

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
}