【发布时间】:2014-10-16 23:58:46
【问题描述】:
(我使用的是 Eclipse Luna 4.4.0,JDK 1.8.0_05)
我在做一个游戏,游戏世界的拓扑结构可以大致分解为World -> Level -> Tile,其中Tile是一小块地形。我设置了三个项目,一个包含这些结构的一些基类,另外两个是服务器和客户端,它们扩展了基础项目中的结构,以满足每个项目所需的额外内容。像这样:
基础项目:
public class BaseWorld{/* ...code... */}
public class BaseLevel{/* ...code... */}
public class BaseTile{/* ...code... */}
在服务器和客户端项目中:
public class World extends BaseWorld{/* ...extended code... */}
public class Level extends BaseLevel{/* ...extended code... */}
public class Tile extends BaseTile{/* ...extended code... */}
现在在基础项目的许多部分,都有返回基类的方法,但在服务器和客户端项目中,这通常意味着我必须重写方法并强制转换为子类型,因为子项目专门使用子类型。像这样:
public class BaseLevel{
BaseLevel getNextLevel(){/* ...code... */}
}
public class Level extends BaseLevel{
Level getNextLevel(){
return (Level)super.getNextLevel();
}
}
这有点难以维持。我发现我可以使用泛型来解决其中的一些问题,使用以下模式:
public class BaseLevel<Level extends BaseLevel<Level>>{
Level getNextLevel(){/* ...code... */}
}
public class Level extends BaseLevel<Level>{
//All sorted! getNextLevel() already returns this subclass type.
}
嗯,我有一个疯狂的想法,将上述模式弯曲到断点,并能够在所有超类中的任何地方使用所有子类。现在我必须说,我绝不认可下面的代码是好的编程,我只是有这个想法,并尽可能地把它拿来看看它会如何工作。无论如何,我想出了以下怪物。
public class BaseWorld<Tile extends BaseTile<Tile, Level, World>
,Level extends BaseLevel<Tile, Level, World>
,World extends BaseWorld<Tile, Level, World>>{
/* ...code... */
}
public class BaseLevel<Tile extends BaseTile<Tile, Level, World>
,Level extends BaseLevel<Tile, Level, World>
,World extends BaseWorld<Tile, Level, World>>{
/* ...code... */
}
public class BaseTile<Tile extends BaseTile<Tile, Level, World>
,Level extends BaseLevel<Tile, Level, World>
,World extends BaseWorld<Tile, Level, World>>{
/* ...code... */
}
现在,每当我需要从任何其他类返回任何类时,我都可以无需在子项目中使用任何强制转换!
不幸的是,没有,因为当 Eclipse 重建工作区时:
A stack overflow error has occurred.
You are recommended to exit the workbench. [...]
我想当一个类的泛型被解析时,它必须去解析另一个类的泛型,然后陷入递归循环。
提问时间:
这个错误是Eclipse编辑器中风,还是java编译器?
以上内容没有在编辑器中突出显示为编译器警告/错误 - 是否应该这样做,即使它在技术上看起来是有效的?
这种递归可能是无限深,还是非常深?
是否有可能在避免此错误的同时实现我在这里尝试的目标? (我再次强调,它绝对不是一个好的模式,我只是想知道它是否可以工作)
【问题讨论】:
标签: java eclipse generics compiler-errors