Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does compiling this code cause a compiler stack overflow?

interface Pong<T> {}
class Ping<T> implements Pong<Pong<? super Ping<Ping<T>>>> {
    static void Ping() {
        Pong<? super Ping<Long>> Ping = new Ping<Long>();
    }
}

Trying to compile this gives the error:

The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
    at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
    at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
    at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2592)
    at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
    ...

Code courtesy of etorreborre on github.

like image 349
fredley Avatar asked Nov 23 '11 09:11

fredley


2 Answers

Because the compiler cannot decide whether a Long is a Pong that is the super of a Ping of a Ping of a Long or whether it is a Ping of a Ping of something that extends a Pong of a Pong ... but I may be wrong.

like image 185
OldCurmudgeon Avatar answered Nov 15 '22 16:11

OldCurmudgeon


Clearly, it is a bug in the Java compiler. The compiler shouldn't crash, especially on a program so small.

It could even be a hole in the Java Language Specification; i.e. an obscure edge case in generics that the JLS authors haven't considered.

But (IMO) this is nothing more than a curiosity, unless you can come up with an example that isn't so obviously contrived to break the compiler. I mean, this example code isn't exactly meaningful ...


Someone with a deep understanding of the Java compiler's implementation could probably figure out why this causes a stack overflow. But it is hardly relevant unless that person is also going to fix the bug. And unless someone can come up with a meaningful example that triggers the same problem, I can't see any value in fixing it.

like image 40
Stephen C Avatar answered Nov 15 '22 16:11

Stephen C