Java, 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
. Pong.
Этот вид рекурсии не может на самом деле следует избегать , потому что есть законные случаи , как 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 .