gpt4 book ai didi

java - 为接受 T 的通用方法提供具体类实例,其中 T 扩展具体类

转载 作者:行者123 更新时间:2023-12-01 18:29:45 25 4
gpt4 key购买 nike

我有一个类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中有测试方法。 ,调用 this 。由于编译器不知道 this 的泛型参数,它不能肯定地说通过 Circle它将起作用(如果 this 引用 CircleDescriber 参数化为 Circle 的子类怎么办?) 更改 thisnew 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());
}
}

关于java - 为接受 T 的通用方法提供具体类实例,其中 T 扩展具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24802155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com