所以第一次使用仿制药,我的任务是制作一个由正方形制成的地牢(游戏世界),这些正方形(实际上是立方体)有很多类型,但这并不重要。
所以我有一个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
的叶子....
我希望有人能得到它并且可以提供帮助。
答案 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
以匹配。