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

问题描述 投票:0回答:2

昨天在一次研讨会上,演讲者(Peter Sestoft)展示了一个小型 Java 程序,有 3 个类,具有协方差和逆变的特点。当尝试使用 javac 进行编译时,类型检查器将抛出 StackOverflowException。

该代码片段是由一些在 Microsoft 工作的人开发的(其中一个人叫 Kennedy)。

使用 Google 找不到它。有谁知道代码片段吗?可以将其粘贴到这里(最多 10 行代码),以供大家查看吗? :)

很好玩...

java covariance stack-overflow contravariance typechecking
2个回答
4
投票

找到了(向主持人询问)!在 6.0 和 7.0 中都是

StackOverflowException

class T { }
class N<Z> { }
class C<X> extends N<N<? super C<C<X>>>> {
  N<? super C<T>> cast(C<T> c) { return c; }
}

来自安德鲁·肯尼迪和本杰明·皮尔斯:论名义的可判定性 带方差的子类型。基金会和国际研讨会 面向对象语言的发展 g(FOOL/WOOD'07),尼斯, 2007 年法国。


3
投票

您是否尝试过位于 bugs.java.com 的 Java Bug 数据库?这是 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.