在编译器或类型检查器 (javac) 中导致堆栈溢出的 Java 片段?

标签 java covariance stack-overflow contravariance typechecking

昨天在一个研讨会上,主持人 (Peter Sestoft) 展示了一个小的 Java 程序,有 3 个类,同时具有协方差和反方差。尝试使用 javac 进行编译时,类型检查器将抛出 StackOverflowException。

这段代码是由一些在 Microsoft 工作的人开发的(想想一个叫 Kennedy 的人)。

无法使用 Google 找到它。有谁知道代码片段,你能把它贴在这里吗(最多10行代码),让大家看看? :)

很好玩...

最佳答案

您是否尝试过 bugs.sun.com?这是 5.0 中的 StackOverflowError:

import java.util.*;

class Test<T extends Comparable<? super T>> {

    abstract class Group<E extends Comparable<? super E>> 
    extends ArrayList<E> 
    implements Comparable<Group<? extends E>> {}

    abstract class Sequence<E extends Comparable<? super E>>
    extends TreeSet<E>
    implements Comparable<Sequence<? extends E>> {}

    public void containsCombination(SortedSet<Group<T>> groups,
                    SortedSet<Sequence<T>> sequences) {
        foo(groups, sequences);
    }

    <C extends Collection<T>> void foo(SortedSet<? extends C> setToCheck,
                       SortedSet<? extends C> validSet) {}

}

这是另一个(同样仅限 5.0):

class F<T> {}
class C<X extends F<F<? super X>>> {
    C(X x) {
        F<? super X> f = x;
    }
}

关于在编译器或类型检查器 (javac) 中导致堆栈溢出的 Java 片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1796144/

相关文章:

java - 如何转义 SQL 查询中使用的特殊字符?

r - 多级建模的协方差结构

python - 使用 matplotlib 绘制缩放和旋转的二元分布

.net-4.0 - 为什么我不能在 .NET 4.0 中将 List<int> 分配给 IEnumerable<object>

asp.net - 使用 WinDbg 和 ADPlus 帮助捕获 StackOverflowException

java - 如何使用不同的包管理 Selenium 项目代码(如页面对象模型/关键字驱动框架)

java - 如何用 Java 编写正确的微基准测试?

java - 如何将主要辅音移至字符串末尾?

java - 递归Java RLE解压方法【stackoverflow错误】

c# - 为什么会出现堆栈溢出异常?