我有一个基类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
。
答案 0 :(得分:0)
我的确切代码没有错误(使用jdk1.6.0_20)。
你是否有阴影类型变量?您显然已经将您的示例编辑为仅仅是您的类名(Thing
等,这是很好的工作顺便说一句),但也许您编辑的内容超出了您的预期。检查您的源代码,了解Y
和X
类型的声明。