2009-11-25 13 views
5

Ieri a un seminario il presentatore (Peter Sestoft) ha mostrato un piccolo programma java, con 3 classi, che presenta sia la co-varianza che la contro-varianza. Quando si tenta di compilare usando javac, il controllo del tipo genererà una StackOverflowException.snippet Java che provoca un overflow dello stack nel compilatore o typechecker (javac)?

Lo snippet è sviluppato da alcuni ragazzi che lavorano in Microsoft (si pensi che uno si chiamasse Kennedy).

Impossibile trovarlo utilizzando Google. Qualcuno conosce lo snippet di codice e potresti incollarlo qui (sono un massimo di 10 righe di codice), perché tutti possano vederlo? :)

E 'stato molto divertente ...

+0

... e potrebbe essere necessario conoscere la versione esatta del javac che mostra tale comportamento . –

+0

sia 6.0 che 7.0 non riesce –

+1

Stai cercando questo documento: http://research.microsoft.com/en-us/um/people/akenn/generics/FOOL2007.pdf –

risposta

3

trovato (ha chiesto al presentatore)! E 'un StackOverflowException sia in 6.0 e 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; } 
} 

E' da parte di Andrew Kennedy e Benjamin Pierce: Su Decidibilità di nominale Sottotipizzazione con varianza. Workshop internazionale sulle fondazioni e Sviluppi di linguaggi orientati agli oggetti g (FOOL/WOOD'07), Nizza, Francia 2007.

+0

ofc potrebbe non causare una StackOverflowException su una macchina con spazio di archiviazione infinito, ma ciò era implicito. Non so se sia così o no. –

+0

Fresco. Possa accadere nella "vita reale" - con un codice "reale" che ha un significato? –

+1

Non è il mio codice, questo è sicuro! :) –

3

Hai provato bugs.sun.com? Ecco un StackOverflowError in 5.0 solo:

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

} 

Ecco un altro (nuovo solo 5.0):

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

Bei esempi, in particolare il secondo. Ma quello che sto cercando fallisce sia in 6.0 che in 7.0. Non riesco a ricordarlo, ma lo riconoscerei se lo vedessi di nuovo :) –

Problemi correlati