2009-11-25 18 views
5

Hôm qua tại một hội thảo, người trình bày (Peter Sestoft) đã cho thấy một chương trình java nhỏ, với 3 lớp, gồm cả phương sai và phương sai. Khi cố gắng biên dịch bằng cách sử dụng javac, trình kiểm tra kiểu sẽ ném ra một StackOverflowException.Đoạn mã Java gây tràn ngăn xếp trong trình biên dịch hoặc trình đánh máy (javac)?

Đoạn mã được phát triển bởi một số người làm việc tại Microsoft (nghĩ rằng một người được gọi là Kennedy).

Không thể tìm thấy bằng Google. Có ai biết đoạn mã và bạn có thể dán đoạn mã vào đây (tối đa 10 dòng mã) để mọi người xem không? :)

Khá thú vị ...

+0

... và có thể cần biết phiên bản chính xác của javac cho thấy hành vi đó . –

+0

cả 6.0 và 7.0 không thành công –

+1

Bạn đang tìm kiếm bài báo này: http://research.microsoft.com/en-us/um/people/akenn/generics/FOOL2007.pdf –

Trả lời

3

Tìm thấy nó (hỏi những người dẫn chương trình)! Đó là một StackOverflowException trong cả 6.0 và 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; } 
} 

Đó là từ Andrew Kennedy và Benjamin Pierce: Trên Decidability của danh nghĩa subtyping với Phương sai. Hội thảo quốc tế về cơ sở và Phát triển ngôn ngữ hướng đối tượng g (FOOL/WOOD'07), Nice, Pháp 2007.

+0

ofc nó có thể không gây ra một StackOverflowException trên một máy với lưu trữ vô hạn, nhưng điều đó đã được ngụ ý. Không biết nếu đó là trường hợp hay không. –

+0

Tuyệt. Có thể nó xảy ra trong "cuộc sống thực" - với mã "thực" có ý nghĩa không? –

+1

Không phải mã của tôi, đó là chắc chắn! :) –

3

Bạn đã thử bugs.sun.com chưa? Dưới đây là một StackOverflowError trong 5,0 chỉ:

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

} 

Đây là một (một lần nữa 5,0 chỉ):

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

Ví dụ hay, đặc biệt là ví dụ thứ hai. Nhưng cái tôi đang tìm kiếm thất bại trong cả 6.0 và 7.0. Tôi không thể nhớ nó, nhưng tôi sẽ nhận ra nó nếu tôi nhìn thấy nó một lần nữa :) –