ජාවා, 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
ජනකතා වර්ගයක් ඇති A
අතර B
, නමුත් තෝරා ගත යුත්තේ කුමක්ද? ස්වයං ගැන අමතක කරන්න, විසඳීමට උත්සාහ කරමු B
. පිං.
හරි, B
generics ටයිප් කර 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
(දෙවරක්).
- බයිට් 89 → 88: භාවිතා කළ දියමන්ති ක්රියාකරු (
new B<A>()
→ new B<>()
).
- බයිට් 88 → 78: VoteToClose ට ස්තූතිවන්ත වෙමින් විචල්ය ප්රකාශය පන්ති සාමාජිකයෙකු වෙත ගෙන යන ලදී .