我有一个类ShapeDescriber看起来像这样:

public class ShapeDescriber<T extends Shape> {
    public void describe(T shape) {
        System.out.println("Its color is " + shape.getColor());
    }
}


我使用T以便子类可以执行以下操作:

public class CircleDescriber<T extends Circle> extends ShapeDescriber<T> {
    public void describe(T circle) {
        super.describe(circle);
        System.out.println("Its radius is " + circle.getRadius());
    }
}


最终,我希望此Describer类型层次结构与模型的类型层次结构匹配。

我遇到的问题是,在CircleDescriber内部,我无法将Circle传递给我的describe()方法!当我尝试这个:

public class CircleDescriber ... {
    ...
    public void printATest() {
        Circle c = new Circle(Colors.GREEN, 10);
        this.describe(c);
    }
}


我的describe()调用出现编译错误,原因是:

The method describe(T) in the type CircleDescriber<T> is not applicable for the arguments (Circle)


等待。什么?我感觉这个类知道T的每个实例都是Circle的子类,不是吗?

编辑:为了方便复制,我在这里创建了要点:https://gist.github.com/craigotis/135f88b1ce8beca07400

请注意,以上要点将无法编译。

最佳答案

我认为这应该按原样工作,但要取决于您如何实例化CircleDescriber。这应该工作:

new CircleDescriber<Circle>().describe(circle);


无法编译的原因是,您在CircleDescriber内部具有test方法,并调用了this。由于编译器不知道this的通用参数,因此无法确定是否将Circle传递给它(如果this引用参数化为CircleDescriber子类的Circle会怎样? >?)在测试方法中用this更改new CircleDescriber<Circle>(),然后编译。

但是,在这里您看到实际上是在类名和通用参数中指定两次描述Circle。至少在Circle是层次结构中的叶节点时,这不是必需的。相反,请执行以下操作:

(保持ShapeDescriber原样)

public class CircleDescriber extends ShapeDescriber<Circle> {
    @Override
    public void describe(Circle circle) {
        super.describe(circle);
        System.out.println("Its radius is " + circle.getRadius());
    }
}

07-25 20:36