Java泛型与递归类型参数绑定

时间:2012-08-19 18:47:17

标签: java generics javac java-7

我有一个基类Thing,它提供了一些基本功能,包括使用ThingInfo子类的类型参数获取对Thing的引用。因为Java没有自我类型,所以我不能将它用于ThingInfo返回值的type参数,因此Thing必须采用递归类型参数以允许我们返回正确的参数化{{1} }。

ThingInfo

到目前为止一切都很好。此代码可根据需要使用。

我还需要表示interface ThingInfo<T> { // just an example method showing that ThingInfo needs to know about // the type parameter T T getThing(); } class Thing<T extends Thing<T>> { // I need to be able to return a ThingInfo with the type parameter // of the sub class of Thing. ie. ThingA.getThingInfo() must return // a ThingInfo<ThingA>. // This is where Java would benefit from self types, as I could declare // the method something like: ThingInfo<THIS_TYPE> getThingInfo() // and Thing would not need a type parameter. ThingInfo<T> getThingInfo() { return something; } } // example Thing implementation class ThingA extends Thing<ThingA> { } // example Thing implementation class ThingB extends Thing<ThingB> { } s。

之间的类型安全关系
Thing

它不是那么简单,但这证明了我的需要。尽管如此,所有这一切都很好,没有错误。现在,class ThingRelation<X extends Thing<X>, Y extends Thing<Y>> { X getParent() { return something; } Y getChild() { return something; } } 需要在ThingRelation和其他ThingRelation之间采用Y参数的方法。所以我将Thing更改为以下内容:

ThingRelation

但是现在我在编译时遇到了这个错误:

class ThingRelation<X extends Thing<X>, Y extends Thing<Y>>
{
    X getParent()
    {
        return something;
    }

    Y getChild()
    {
        return something;
    }

    <Z extends Thing<Z>> void useRelation(ThingRelation<Y, Z> relation)
    {
        // do something;
    }
}

错误发生在type argument Y is not within bounds of type-variable X where Y,X are type-variables: Y extends Thing<Y> declared in class ThingRelation X extends Thing<X> declared in class ThingRelation

的行上

究竟是什么问题?

更新<Z extends Thing<Z>>....版本为javac

1 个答案:

答案 0 :(得分:0)

我的确切代码没有错误(使用jdk1.6.0_20)。

你是否有阴影类型变量?您显然已经将您的示例编辑为仅仅是您的类名(Thing等,这是很好的工作顺便说一句),但也许您编辑的内容超出了您的预期。检查您的源代码,了解YX类型的声明。