6

我有一个基类,它提供了一些基本功能,包括使用子类类型的类型参数Thing获取对 a 的引用。因为 Java 没有 self 类型,所以我不能将它用于返回值的类型参数,所以必须采用递归类型参数才能让我们返回正确的 parameterized 。ThingInfoThingThingInfoThingThingInfo

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需要一个接受ThingRelationbetweenY和 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

4

1 回答 1

0

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

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

于 2012-08-19T18:59:13.583 回答