2009-11-25 15 views
5

कल एक संगोष्ठी में प्रेजेंटर (पीटर सेस्टॉफ्ट) ने एक छोटे से जावा कार्यक्रम को दिखाया, जिसमें 3 वर्ग थे, जिसमें सह-भिन्नता और अनुबंध-भिन्नता दोनों शामिल थे। जावैक का उपयोग करके संकलन करने का प्रयास करते समय, टाइप चेकर एक स्टैक ओवरफ्लो एक्सेप्शन फेंक देगा।जावा स्निपेट जो कंपाइलर या टाइपशेकर (जावा) में स्टैक ओवरफ़्लो का कारण बनता है?

स्निपेट कुछ लोगों द्वारा विकसित किया गया है जो माइक्रोसॉफ्ट में काम करते हैं (सोचें कि किसी को केनेडी कहा जाता है)।

Google का उपयोग करके इसे नहीं ढूंढ सकता। क्या कोई कोड स्निपेट जानता है, और क्या आप इसे यहां पेस्ट कर सकते हैं (यह कोड की अधिकतम 10 पंक्तियां) है, हर किसी को देखने के लिए? :)

यह काफी मजेदार था ...

+0

... और यह है कि उस व्यवहार से पता चलता javac का सही संस्करण पता करने के लिए आवश्यक हो सकता है । –

+0

दोनों 6.0 और 7.0 विफल रहता है –

+1

आप इस पेपर की तलाश में हैं: http://research.microsoft.com/en-us/um/people/akenn/generics/FOOL2007.pdf –

उत्तर

3

मिले यह (प्रस्तोता पूछा)! यह 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; } 
} 

यह एंड्रयू कैनेडी और बेंजामिन पियर्स से है: विचरण के साथ नाममात्र Subtyping की decidability पर। अंतर्राष्ट्रीय कार्यशाला मूलाधार और वस्तु उन्मुख बोली जी के विकास (मूर्ख/WOOD'07) पर, नाइस, फ्रांस 2007

+0

OFC यह असीमित भंडारण वाली मशीन पर स्टैक ओवरव्लो एक्सेप्शन का कारण नहीं बन सकता है, लेकिन यह निहित था। पता नहीं है कि यह मामला है या नहीं। –

+0

कूल। यह "वास्तविक जीवन" में हो सकता है - "वास्तविक" कोड के साथ जिसका अर्थ है? –

+1

मेरा कोड नहीं, यह निश्चित रूप से है! :) –

3

क्या आपने bugs.sun.com की कोशिश की है?

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) बताया गया है:: यह एक 5.0 केवल में StackOverflowError है

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

अच्छे उदाहरण, विशेष रूप से दूसरा। लेकिन जिसकी मैं तलाश कर रहा हूं वह 6.0 और 7.0 दोनों में विफल रहता है। मुझे यह याद नहीं है, लेकिन अगर मैं इसे फिर से देखता हूं तो मैं इसे पहचानूंगा :) –

संबंधित मुद्दे