我有一个基类,它提供了一些基本功能,包括使用子类类型的类型参数Thing
获取对 a 的引用。因为 Java 没有 self 类型,所以我不能将它用于返回值的类型参数,所以必须采用递归类型参数才能让我们返回正确的 parameterized 。ThingInfo
Thing
ThingInfo
Thing
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
betweenY
和 some other参数的方法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.7.0_05
。