2009-11-25 16 views
5

Ayer, en un seminario, el presentador (Peter Sestoft) mostró un pequeño programa de Java, con 3 clases, presentando tanto varianza conjunta como contra-variación. Al intentar compilar usando javac, el verificador de tipos arrojará una StackOverflowException.¿Fragmento de Java que causa el desbordamiento de la pila en el compilador o en el registrador de tipos (javac)?

El fragmento está desarrollado por algunos tipos que trabajan en Microsoft (creo que uno se llamaba Kennedy).

No se puede encontrar utilizando Google. ¿Alguien conoce el fragmento de código y podría pegarlo aquí (es un máximo de 10 líneas de código) para que todos lo vean? :)

Fue bastante divertido ...

+0

... y puede ser necesario conocer la versión exacta del javac que muestra ese comportamiento . –

+0

ambos 6.0 y 7.0 fallan –

+1

Usted busca este papel: http://research.microsoft.com/en-us/um/people/akenn/generics/FOOL2007.pdf –

Respuesta

3

lo encontró (preguntó el presentador)! Es un StackOverflowException tanto en 6.0 y 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; } 
} 

Es de Andrew Kennedy y Benjamin Pierce: En Decidibilidad del nominal Subtipificación con Varianza. Taller internacional sobre fundaciones y Desarrollos de lenguajes orientados a objetos g (FOOL/WOOD'07), Niza, Francia 2007.

+0

no puede causar una StackOverflowException en una máquina con almacenamiento infinito, pero eso fue implícito. No sé si ese es el caso o no. –

+0

Cool. ¿Puede suceder en la "vida real", con un código "real" que tiene un significado? –

+1

¡No es mi código, eso es seguro! :) –

3

¿Ha intentado bugs.sun.com? Aquí hay una StackOverflowError en 5.0 solamente:

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

} 

Aquí hay otro (de nuevo sólo 5,0):

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

Buenos ejemplos, especialmente el segundo. Pero el que estoy buscando falla tanto en 6.0 como en 7.0. No lo recuerdo del todo, pero lo reconocería si lo volviera a ver :) –

Cuestiones relacionadas