Bug do compilador AspectJ leva ao StackOverflowError

9

Eu me deparei com um erro StackOverflow do compilador AspectJ hoje e achei que deveria compartilhá-lo no StackOverflow :-) Para reproduzir o erro, fiz um exemplo de brinquedo

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());
    }
}

Tentar compilar este código resulta no seguinte erro:

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)  

No entanto, se eu modificar a classe Generics in the Node para

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

(observe o ? em vez de Q ), o programa funciona e imprime o que você esperaria:

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

apesar de o Eclipse reclamar que

  

O método setParent (StringContentNode) é indefinido para o tipo StringContentNode

se eu deixar a interface do WithParent vazia como está agora, ou que

  

O tipo StringContentNode deve implementar o método abstrato herdado   WithParent.getParent ()

Se eu definir o getter e o setter na interface.
Devo sinalizar o bug? Existe uma maneira mais limpa de obter a mesma funcionalidade, sem incorrer em nenhum problema estranho de compilação? Obrigado!

    
por Emanuele Fusco 31.10.2017 в 08:47
fonte

1 resposta

2

Parece que ninguém irá propor uma solução alternativa que permita continuar implementando interfaces genéricas recursivas através do AspectJ, apesar do bug. Teria sido interessante encontrar tal solução, mas acho que não é provável que exista.

Por favor, lance seus votos no relatório de erros link , se puder.

Felicidades.

    
por Emanuele Fusco 26.11.2017 / 09:43
fonte