Java Generics错误:不适用于参数

时间:2011-05-20 12:26:54

标签: java generics methods recursion arguments

所以第一次使用仿制药,我的任务是制作一个由正方形制成的地牢(游戏世界),这些正方形(实际上是立方体)有很多类型,但这并不重要。

所以我有一个ComposedDungeons类,这个类代表一个由其他地下城建造的地牢,它没有自己的方块,但包含SubDungeon类的其他子节点。通过这种方式,我得到了一个树状结构,其中有一个根ComposedDungeon,并且叶子不能有自己的叶子,除非它们也是ComposedDungeons

第一个(超级课程)

public abstract class Subdungeon<E extends Square> {
....

ProblemMethod:

protected abstract Dimension getDimensionOf(E square);

第二个:

public class ComposedDungeon<E extends Square> extends Subdungeon<E> {

    /**
 * Return the dimension of the given Square.
 * 

 * @param   square
 *          The square of which the dimension is required.
 * @return  The dimension which contains this square.
 */
protected Dimension getDimensionOf(E square){
    for(Subdungeon<? extends E> dungeon : getAllSubdungeons()){
        Dimension dimension = dungeon.getDimensionOf(square);
        if(dimension != null)
            return dimension.add(getDimensionOfDungeon(dungeon));
    }
    return null;
}
  

错误 的      - Subdungeon类型中的方法getDimensionOf(?extends E)&lt; ?扩展E>不适用于参数(E)

我不知道如何解决这个问题,我的想法是让方法递归,所以它会一直搜索,直到它找到一个不是ComposedDungeon的叶子....

我希望有人能得到它并且可以提供帮助。

4 个答案:

答案 0 :(得分:2)

我相信问题出现在ComposedDungeon#getDimensionOf(E)方法的for循环中。

for(Subdungeon<? extends E> dungeon : getAllSubdungeons()){

......应该......

for(Subdungeon<E> dungeon : getAllSubdungeons()){

E已被定义为类型Square的子类,因此没有必要添加,事实上,它是不正确的。

答案 1 :(得分:0)

我不相信你可以这样继承(<something extends somethingElse>)它需要在那个电话之外:<something> extends somethingElse

答案 2 :(得分:0)

尝试这样:

public class Subdungeon<E>
{
    protected abstract Dimension getDimension(E square);
}

public class ComposedDungeon<E> extends Subdungeon<E>
{
    protected Dimension getDimension(E square)
    {
        Dimension dimension;

        // put your stuff here.

        return dimension;
    }
}

答案 3 :(得分:0)

我不能在不了解更多代码的情况下最终回答这个问题,但是......

强制执行getDimension方法的参数必须与类的泛型类型匹配的原因是什么?是否只能使用ComposedDungeon<Rectangle>而不是getDimension(Rectangle)来调用getDimension(Square)是否有意义?

至少你在示例中调用它的方式,看起来你真的想在匹配基类型的任何上调用它 - 所以,我会改变原来的方法Subdungeon使用基本类型 -

public abstract class Subdungeon<E extends Square>
{
    ...
    protected abstract Dimension getDimensionOf(Square square);
    ...
}

并更改ComposedDungeon以匹配。