Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java泛型可能会挂起编译器_Java_Generics_Compilation_Freeze - Fatal编程技术网

使用Java泛型可能会挂起编译器

使用Java泛型可能会挂起编译器,java,generics,compilation,freeze,Java,Generics,Compilation,Freeze,我有大约55个Java接口和5个抽象类。每个声明都使用相同的泛型参数集:它列出了大约60个声明,因此每个实现都知道每个其他实现的特定类型,并在方法参数中替换该类型,并根据需要返回。似乎泛型的这种(可能过度)使用导致编译器挂起。编译器抛出OutOfMemoryError,但似乎没有终止 考虑到我的情况,即使包含其中一个声明的代码清单也有点困难,但清单的一部分可能是可能的。接口声明通常指定大约五个方法的集合,但是在声明中使用泛型将源模块的大小增加到大约一千行 我的例子是编译器实际进入无限循环,还是应

我有大约55个Java接口和5个抽象类。每个声明都使用相同的泛型参数集:它列出了大约60个声明,因此每个实现都知道每个其他实现的特定类型,并在方法参数中替换该类型,并根据需要返回。似乎泛型的这种(可能过度)使用导致编译器挂起。编译器抛出OutOfMemoryError,但似乎没有终止

考虑到我的情况,即使包含其中一个声明的代码清单也有点困难,但清单的一部分可能是可能的。接口声明通常指定大约五个方法的集合,但是在声明中使用泛型将源模块的大小增加到大约一千行

我的例子是编译器实际进入无限循环,还是应该给它更多的内存?抛出OutOfMemoryError异常大约需要20分钟,因此我担心,如果我只是将提供给编译器的内存增加一个因子,那么编译器抛出异常只需要更长的时间

我使用NetBeans作为我的编辑器环境,但在启动NetBeans后,我就开始运行clean/build脚本。我这样做是因为NetBeans在启动后开始检查代码的语法时,很快就会失去响应。我正在使用Ubuntu10.4(我想——我是在Windows上写的)。我已经求助于在Ubuntu环境中打开一个命令行,将NetBeans作为后台进程运行,使用gedit检查输出并纠正任何源代码错误,杀死NetBeans,然后重新启动NetBeans。这似乎足够了,直到我发现不再产生语法错误。我不知道如何从命令行运行clean/build脚本

很抱歉,如果这个问题显得含糊不清,但如果其他人能帮助我,也许我可以更具体一点


感谢您的建议。

我觉得您对泛型的使用过于复杂,这导致Java编译器使用过多的内存来表示泛型类型的扩展。失败之前的很长时间可能是由于“垃圾收集死亡螺旋”。。。GC花费越来越多的时间,每次回收的内存越来越少,直到最后不得不放弃

如果您不能向我们展示代码,唯一可能的建议是使用更大的堆运行编译器,看看这是否解决了问题

我不知道如何从命令行运行clean/build脚本

嗯,我想你需要弄清楚。它可能会帮助你解决问题,不管怎样,了解这些事情是很重要的;e、 这样您就可以使用CI系统来构建代码并运行测试。(您可能需要从命令行运行该脚本,以使构建在一个单独的JVM中运行,该JVM的堆大小可以独立于IDE进行控制。)


泛型的复杂使用也可能包括Java编译器无法处理的病态(可能是无意义的)内容

关于我的泛型声明,一个可能的问题是它们是自引用的;一个声明指的是另一个声明,该声明指的是第一个声明


是的。。。这就是我要说的。如果你不小心,你可能会得到一些毫无意义的东西(从Java的角度来看),涉及无限类型的扩展。

有多少源文件?不管这是否会挂起编译器,这听起来很可怕。很抱歉,我无法想象你在描述什么。你能提供一个简短的清单来展示你的技巧吗(因为没有更好的词)?也许是单字母类名的东西?试着给编译器更多的内存!您可以发布一个指向其中一个声明片段的链接吗?老实说,我只是想呆呆地看一看。我不认为有“无限类型扩展”是可能的。我试图做的是完成一个循环引用模式,从一个接口到所有其他接口,再回到它自己。我的项目是实施一个我已经有好几年的想法,这个想法基于一个定义自我概念的系统。可能是Java无法对这些概念建模,也可能是我的概念本质上不是算法的。我去散步了,还考虑过其他的可能性。目前,我将关注其他几条线索。谢谢您的时间。@OwenThomas-我想您对Java的期望可能太高了。这是一种编程语言。。。不是一个模型类型的系统。@OwenThomas你的问题让我想起了这一点和我的答案。不知道这有多大关系。@StephenC我想我发现了这一点。我选择Java是因为我只知道相对较少的语言环境,而在这些环境中,Java似乎是最有能力的。如果我有更广泛的知识,我可能会做出更明智的选择。也许,Java仍然是一个不错的选择,因为它是一种受广泛支持的语言,并且它还有我的实现所利用的其他特性。