5

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

该片段是由一些在微软工作的人开发的(想想一个叫做肯尼迪)。

用谷歌找不到。有谁知道代码片段,你能把它贴在这里(最多10行代码)给大家看吗?:)

这很有趣……

4

2 回答 2

3

你试过 bugs.sun.com 吗?这是StackOverflowError5.0 中的一个:

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;
    }
}
于 2009-11-25T12:20:04.957 回答
3

找到了(问主持人)!它StackOverflowException在 6.0 和 7.0 中都有:

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; }
}

它来自 Andrew Kennedy 和 Benjamin Pierce:论具有方差的名义子类型的可判定性。面向对象语言的基础和发展国际研讨会 g(FOOL/WOOD'07),法国尼斯,2007 年。

于 2009-11-27T13:40:20.657 回答