强制参数化类型作为构造函数参数是正确的

时间:2011-05-16 14:56:41

标签: java generics

我一直在寻找这一点,并没有真正接近我需要的东西。

示例代码:

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>

4 个答案:

答案 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)