哈哈!尝试编译这段Java代码
interface Interface<T> {}
class Bang<T> implements Interface<Interface<? super Bang<Bang<T>>>> {
static void bang() {
Interface<? super Bang<Byte>> bang = new Bang<Byte>();
}
}
(对我来说,编译器会堆栈溢出,Eclipse会请求我允许崩溃。)
我不确定这个问题有多广为人知。这并不是编译器的真正错误,更像是Java类型系统中的错误。我从这篇优秀的论文中得知这个问题,这篇论文也提出了对这个问题的解决方案,但该论文似乎基于这篇其他论文的工作,我也将它链接起来,因为我非常喜欢Stefan Wehr在JavaGI方面的研究。
更新:这里有另一篇处理这个问题的论文,这次是从微软的人那里来的。
顺便说一下,我可以用等效的代码使Ceylon类型检查器堆栈溢出
interface Interface<in T> {}
class Bang<T>() satisfies Interface<Interface<Bang<Bang<T>>>> {}
void bang() { Interface<Bang<String>> bang = Bang<String>(); }
我想我会立即着手实现Tate等人提出的解决方案