AspectJ编译器错误导致StackOverflowError

时间:2017-10-31 07:47:28

标签: java stack-overflow aspectj compiler-bug

我今天遇到了AspectJ编译器的StackOverflow错误,我想我应该在StackOverflow上分享它:-) 为了重现错误,我做了一个玩具示例

public abstract class Node<T,Q extends Node<T,Q>> implements WithParent<Q>{
    private T content;
    //getter and setter for content
}
public aspect WithParentAspect {
    private T WithParent<T>.parent;
    public T WithParent<T>.getParent() {
        return this.parent;
    }
    public void WithParent<T>.setParent(T parent) {
        this.parent=parent;
    }
}
public interface WithParent<T> { }
public class StringContentNode extends Node<String, StringContentNode>{
    public static void main (String [] args) {
        StringContentNode root = new StringContentNode();
        StringContentNode leaf = new StringContentNode();

        root.setContent("root");
        leaf.setContent("leaf");
        leaf.setParent(root);
        System.out.println(leaf);                   
        System.out.println(leaf.getParent());
    }
}

尝试编译此代码会导致以下错误:

java.lang.StackOverflowError
at org.aspectj.weaver.World$TypeMap.put(World.java:1198)
at org.aspectj.weaver.World.resolve(World.java:398)
at org.aspectj.weaver.World.resolve(World.java:277)
at org.aspectj.weaver.World.resolve(World.java:229)
at org.aspectj.weaver.UnresolvedType.resolve(UnresolvedType.java:615)
at org.aspectj.weaver.ReferenceType.isAssignableFrom(ReferenceType.java:621)
at org.aspectj.weaver.ReferenceType.isAssignableFrom(Ref ...
bleFrom(ReferenceType.java:459)
at org.aspectj.weaver.TypeVariable.isASubtypeOf(TypeVariable.java:201)  

但是,如果我将Node类中的Generics修改为

public abstract class Node<T,Q extends Node<T,?>> implements WithParent<Q>{
...

(注意而不是 Q ),该程序可以正常工作,并打印出您期望的内容:

Node (content=leaf, parent=Node (content=root, parent=null))
Node (content=root, parent=null)

即使Eclipse抱怨

  

对于StringContentNode类型,未定义方法setParent(StringContentNode)

如果我将WithParent接口留空,或者

  

StringContentNode类型必须实现继承的抽象方法   WithParent.getParent()

如果我在界面中定义了getter和setter 我应该发出错误的信号吗?是否有更简洁的方法来实现相同的功能,而不会产生任何奇怪的编译问题? 谢谢!

1 个答案:

答案 0 :(得分:2)

似乎没有人会提出一个解决方法,允许通过AspectJ继续实现递归泛型接口,尽管存在错误。 找到这样的解决方案会很有趣,但我想它不太可能存在。

如果可以的话,请对错误报告https://bugs.eclipse.org/bugs/show_bug.cgi?id=526707投票。

干杯。