java – 这个令人费解的泛型模式崩溃了Eclipse – 我可以让它工
(我正在使用
Eclipse Luna 4.4.0,JDK 1.8.0_05)
我正在制作游戏,游戏世界的拓扑结构可以粗略地分解为世界 – >等级 – >瓷砖,瓷砖是一小块地形.我设置了三个项目,一个包含这些结构的一些基类,另外两个是服务器和客户端,它们扩展了基础项目中的结构,以满足每个项目所需的其他内容.像这样: 基地项目: 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,World extends BaseWorld<Tile,World>>{ /* ...code... */ } public class BaseLevel<Tile extends BaseTile<Tile,World>>{ /* ...code... */ } public class BaseTile<Tile extends BaseTile<Tile,World>>{ /* ...code... */ } 现在,每当我需要从任何其他类中返回任何类时,我都可以不必在子项目中使用任何构建! 不幸的是,因为当Eclipse重建工作区时: A stack overflow error has occurred. You are recommended to exit the workbench. [...] 我想当一个类的泛型正在被解决时,它必须去解析另一个类的泛型然后陷入递归循环. 提问时间: 这个错误Eclipse编辑器有中风还是java编译器? 上面没有在编辑器中突出显示编译器警告/错误 – 它应该是,即使它看起来技术上有效吗? 这种递归可能是无限深,还是只是非常深? 是否有可能实现我在这里尝试的同时避免这个错误? (我再次强调它绝对不是一个好模式,我只想知道它是否可行) 解决方法
Eclipse编辑器是中风还是java编译器?
这种情况下的Eclipse编辑器.以下声明(当然,在不同的文件中)是有效的Java代码. public class BaseFoo<F extends BaseFoo<F,B>,B extends BaseBar<F,B>> {} public class BaseBar<F extends BaseFoo<F,B>> {} public class Foo<F extends BaseFoo<F,B>> extends BaseFoo<F,B> {} public class Bar<F extends BaseFoo<F,B>> extends BaseBar<F,B> {} 上面没有在编辑器中突出显示编译器警告/错误 – 它应该是,即使它看起来技术上有效吗? 它可能应该(好吧,好吧,我在这里开玩笑……)不.这是有效的Java.只是……呃…… 这种递归可能是无限深,还是只是非常深? 无限,我猜这里(更多关于我的猜测). 考虑尝试实例化Foo的实例. 继续,使用默认构造函数写出初始化程序. Foo<Foo,Bar> foo = new Foo<Foo,Bar>(); 这里有四个错误,关于通用边界不匹配. 我们试着解决它. Foo<Foo<Foo,Bar>,Bar<Foo,Bar>> foo = new Foo<Foo<Foo,Bar>>(); 现在有12个错误.我们可以继续尝试初始化它. 是否有可能实现我在这里尝试的同时避免这个错误? (我再次强调它绝对不是一个好模式,我只想知道它是否可行) 考虑以下基本结构: class World { SomeCollection<Level> levels; } class Level { SomeCollection<Tile> tiles; } class Tile { } 为什么? 上述代码的基本结构优先于composition over inheritance,除了某些内置泛型集合类型外,不使用泛型.由此提供的初始化样式的一个很好的例子是静态构建器,最后编写类似这样的东西来初始化一个World: World gameWorld = new World.Builder(). .loadLevels(levelSource) .loadTiles(tileset) .build(); 我希望这有帮助. 结束笔记 不要继续.这是探索问题的可能方法的探索途径.不要再去这里了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |