자바, 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 A
B
와 사이에 계층 구조가 있어야합니다 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 덕분에 변수 선언을 클래스 멤버로 옮겼습니다 .