자바, 102 95 89 88 78 바이트
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}
이것은 StackOverflowError일반 해상도 시스템이 다른 제네릭을 해결할 루트를 결정할 수 없기 때문에 발생합니다.
크레딧이있는 곳 .
여기서 어떻게됩니까?
A<T>1 글자 부모가 있습니다. 일반적입니다. 사용할 수는 List있지만 4 개의 문자를 가져오고 반복하는 것이 너무 깁니다.
B<T> 기본 제네릭을 선언합니다.
B extends AB와 사이에 계층 구조가 있어야합니다 A.
extends A<A>에 자체 참조를 만듭니다 A<T>.
A<? super B> 에 대한 일반 검색을 트리거합니다. A<T>
B<B<T>>에 자체 참조를 만듭니다 B<T>.
A<...> a=new B<>()컴파일 할 때 해상도를 강요하고 B나중에 정의하지 않고 제네릭을 단순히 정의하는 대신 제네릭을 사용하도록합니다 .
A<?super B자체 참조를 생성하지 않기 때문에의 제네릭에서 한 유형과 다른 유형에 대한 참조가 모두 A있습니다.
B<A>자체 참조를 생성하지 않기 때문에의 제네릭에서 한 유형과 다른 유형에 대한 참조가 모두 B있습니다.
이제 형식 A에는 generics 형식 A과 B가 있지만 어느 것을 선택해야합니까? 자아는 잊어 버리세요 B. 핑.
좋아, B제네릭 형식 A과 B가 있지만 어느 것을 선택해야합니까? 자아는 잊어 버리세요 A. 탁구.
이러한 종류의 재귀는 실제로 다음과 같은 합법적 인 사례가 있기 때문에 피할 수 없습니다 A<B<A<B<A<B<Object>>>>>>: 예 : JSON 객체 : List<Map<String,Map<String,List<Map<String,List<String>>>>>>.
컴파일 결과
$ javac NoCompile.java
The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2587)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:3260)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2592)
at com.sun.tools.javac.code.Types$23.visitClassType(Types.java:2579)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:554)
내 시스템에서 스택 추적은 1024 줄을 표시 한 후 실제로 중지됩니다.이 줄은 실제로 4 개의 동일한 줄이 256 번 반복되어 무한 재귀를 증명합니다. 그 모든 흔적을 아껴 줄게
저금
- 102 → 95 바이트 :
interface+ implements를 class+ 로 바꿨 습니다 extends.
- 95 → 89 바이트 : 교체
Long와 함께 A(2 회).
- 89 → 88 바이트 : 사용 된 다이아몬드 연산자 (
new B<A>()→ new B<>()).
- 88 → 78 바이트 : VoteToClose 덕분에 변수 선언을 클래스 멤버로 옮겼습니다 .