0

有类:

InterfaceInterval<C extends Comparable<C>, I extends InterfaceInterval<C, I>> extends Comparable<InterfaceInterval<C, ?>>
AbstractInterval<C extends Comparable<C>, I extends AbstractInterval<C, I>> implements InterfaceInterval<C, I>, Serializable, Cloneable
AbstractTimeInterval<I extends AbstractTimeInterval<I>> extends AbstractInterval<Date, I>
SortedIntervalsList<C extends Comparable<C>, I extends AbstractInterval<C, ?>> extends ArrayList<I>
Timeline extends SortedIntervalsList<Date, AbstractTimeInterval<?>>

现在添加这一行:

Timeline t = (Timeline) super.clone();

到 Timeline 类中的 clone() 方法,我得到:

mvn -e clean compile
The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
    at com.sun.tools.javac.code.Type$WildcardType.isSuperBound(Type.java:435)
    at com.sun.tools.javac.code.Types$1.visitWildcardType(Types.java:102)
    at com.sun.tools.javac.code.Types$1.visitWildcardType(Types.java:98)
    at com.sun.tools.javac.code.Type$WildcardType.accept(Type.java:416)
    at com.sun.tools.javac.code.Types$MapVisitor.visit(Types.java:3232)
    at com.sun.tools.javac.code.Types.upperBound(Types.java:95)
    at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986)
    at com.sun.tools.javac.code.Types.adapt(Types.java:3016)
    at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2977)
    at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986)
    at com.sun.tools.javac.code.Types.adapt(Types.java:3016)
    ...
    at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:516)
    at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:114)
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:451)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:558)
    ... 16 more

但是,当我评论那一行时:

//Timeline t = (Timeline) super.clone();

和:

mvn compile
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
...

然后再次取消注释该行:

Timeline t = (Timeline) super.clone();

和:

mvn compile
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
...

所以它在没有什么帮助的情况下工作正常;)。在 Eclipse 上它也可以工作:/。我应该怎么办?它是java编译器错误还是什么?

完整的控制台日志。

4

2 回答 2

2

假设编译器或 JVM 中的错误几乎从来都不是一个好主意。如果您假设问题出在您和您的代码上,那么您将更快地解决您的问题 - 首先,最后,并且始终如此。无论如何,请搜索错误数据库或 Google 以查看是否有其他人遇到过您的问题。(当我遇到异常时,这是我做的第一件事。)但是您会发现 JVM 存在的时间更长,暴露错误的用户比您的代码更多,因此问题出在您的代码或代码中的可能性更大。对事物“应该”如何运作的错误假设。

问题很明显:您遇到的情况是,一个类的克隆调用另一个类,该类调用第一个类,该类再次调用另一个类,将调用添加到调用堆栈直到溢出。删除对 super.clone() 的调用会中断循环。

也许一个好的起点是:为什么您的类 Timeline 会覆盖 clone 方法?一个体面的复制构造函数没有给你什么?也许这真的是一个设计问题。

于 2009-08-30T21:54:28.513 回答
1

我同意 duffymo - 编译器尝试解决一个循环,该循环在一个或另一个类已经编译之前不起作用(这可能导致第二次成功)。

仔细一看,这个看起来真的很糟糕(注意所有的Is):

AbstractTimeInterval<I extends AbstractTimeInterval<I>> extends AbstractInterval<Date, I>

好的,我想我知道你在那里尝试了什么以及为什么,但试着为那个画一个继承图。我认为你需要重组它。摆脱那个类(你必须为 中的方法找到另一个地方AbstractTimeInterval)并改变

Timeline extends SortedIntervalsList<Date, AbstractTimeInterval<?>>

Timeline extends SortedIntervalsList<Date, AbstractInterval<Date,?>>
于 2009-08-30T22:12:37.540 回答