2009-11-25 14 views
5

Hier, lors d'un séminaire, le présentateur (Peter Sestoft) a montré un petit programme Java, avec 3 classes, présentant à la fois la covariance et la contre-variance. Lorsque vous tentez de compiler en utilisant javac, le vérificateur de type lancera une exception StackOverflowException.Extrait Java provoquant un débordement de pile dans le compilateur ou typechecker (javac)?

L'extrait est développé par certains gars qui travaillent chez Microsoft (on pense qu'on s'appelait Kennedy).

Impossible de le trouver en utilisant Google. Est-ce que quelqu'un connaît l'extrait de code, et pourriez-vous le coller ici (c'est 10 lignes de code maximum), pour tout le monde à voir? :)

Il était très amusant ...

+0

... et il peut être nécessaire de connaître la version exacte du javac qui montre ce comportement . –

+0

à la fois 6.0 et 7.0 échoue –

+1

Vous recherchez ce document: http://research.microsoft.com/en-us/um/people/akenn/generics/FOOL2007.pdf –

Répondre

3

Je l'ai trouvé (demandé au présentateur)! Il est un StackOverflowException à la fois 6.0 et 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; } 
} 

Il est de Andrew Kennedy et Benjamin Pierce: Sur Décidabilité de nominal sous-typage avec la variance. Atelier international sur les fondations et Développements de langages orientés objet g (FOOL/WOOD'07), Nice, France 2007.

+0

ofc il ne peut pas provoquer une exception StackOverflowException sur une machine avec un stockage infini, mais cela était implicite. Je ne sais pas si c'est le cas ou non. –

+0

Cool. Peut-il arriver dans la «vraie vie» - avec un code «réel» qui a un sens? –

+1

Pas mon code, c'est sûr! :) –

3

Avez-vous essayé bugs.sun.com? Voici un StackOverflowError à 5,0 seulement:

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) {} 

} 

est ici une autre (encore 5.0 uniquement):

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

Bons exemples, en particulier le second. Mais celui que je cherche échoue à la fois dans 6.0 et 7.0. Je ne peux pas m'en souvenir tout à fait, mais je le reconnaîtrais si je le voyais à nouveau :) –