Я читал эту статью о "странных вещах в Java", и я наткнулся на интересную концепцию: Undecidable types.
Рассмотрим следующие три класса/интерфейсов:
public interface Type<T> { }
public class D<P> implements Type<Type<? super D<D<P>>>> { }
public class WildcardTest {
Type<? super D<Byte>> d = new D<Byte>();
}
По-видимому, проблема в том, что она неразрешима, является ли D
a Type<? super D<Byte>>
; может ли кто-нибудь объяснить это дальше?
javac 1.8.0_60
выдает очень длинный StackOverflowError
при попытке скомпилировать WildcardTest
:
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:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3834)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3839)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3839)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
at com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4640)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3839)
at com.sun.tools.javac.code.Types$26.visitClassType(Types.java:3826)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
Этот код также разбивает всю среду Eclipse.
Автор отправил сообщение об ошибке с командой Eclipse, но он не получил никаких голосов (кроме моих). Можно ли что-нибудь сделать? Это просто проблема закрытия в форме компилятора?
В статье есть ссылка на эту статью, но я надеюсь, что есть более простое объяснение.