Java类型系统中与通配符相关的有趣问题

发布者    |      

哈哈!尝试编译这段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等人提出的解决方案


返回顶部