Java, 102 95 89 88 78 byte
class A<T>{}class B<T>extends A<A<?super B<B<T>>>>{A<?super B<A>>a=new B<>();}
Điều này chấm dứt với một StackOverflowError
điều xảy ra bởi vì hệ thống phân giải chung không thể quyết định một gốc để giải quyết các tổng quát khác.
Tín dụng do đến hạn .
chuyện gì xảy ra ở đây thế?
A<T>
chỉ ở đó để có một phụ huynh 1 chữ cái. Đó là chung chung. Tôi có thể đã sử dụng List
, nhưng việc nhập và lặp lại 4 chữ cái quá dài.
B<T>
tuyên bố chung chung cơ bản.
B extends A
được yêu cầu phải có một hệ thống phân cấp giữa B
và A
.
extends A<A>
tạo một tài liệu tham khảo tự A<T>
.
A<? super B>
kích hoạt việc tìm kiếm thuốc generic trên A<T>
B<B<T>>
tạo một tài liệu tham khảo tự B<T>
.
A<...> a=new B<>()
buộc sử dụng các tổng quát, thay vì chỉ đơn giản là định nghĩa của các tổng quát, buộc độ phân giải khi biên dịch B
, và không sau đó.
A<?super B
tạo ra một tham chiếu không tự, vì vậy chúng ta có cả một tham chiếu đến một loại và một loại khác trong các tổng quát của A
.
B<A>
tạo ra một tham chiếu không tự, vì vậy chúng ta có cả một tham chiếu đến một loại và một loại khác trong các tổng quát của B
.
Bây giờ, loại A
có loại generic A
và B
, nhưng được chọn? Quên đi bản thân, hãy cố gắng giải quyết B
. Bình.
Được rồi, B
có loại thuốc generic A
và B
, nhưng cái nào sẽ được chọn? Quên đi bản thân, hãy cố gắng giải quyết A
. Pông.
Loại đệ quy này thực sự không thể tránh được vì có những trường hợp hợp pháp như A<B<A<B<A<B<Object>>>>>>
: ví dụ: một đối tượng JSON : List<Map<String,Map<String,List<Map<String,List<String>>>>>>
.
Kết quả tổng hợp
$ 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)
Trên hệ thống của tôi, dấu vết ngăn xếp dừng lại sau khi hiển thị 1024 dòng, thực tế là 4 dòng giống nhau được lặp lại 256 lần, do đó chứng minh một đệ quy vô hạn. Tôi sẽ dành cho bạn toàn bộ dấu vết đó.
Tiết kiệm
- 102 → 95 byte: thay thế
interface
+ implements
bằng class
+ extends
.
- 95 → 89 byte: được thay thế
Long
bằng A
(hai lần).
- 89 → 88 byte: toán tử kim cương đã sử dụng (
new B<A>()
→ new B<>()
).
- 88 → 78 byte: đã chuyển khai báo biến sang một thành viên của lớp, nhờ vào VoteToClose .