Предыстория: в этом ответе встал вопрос (первый вариант ответа, если быть точным). Код, представленный в этом вопросе, сводится к минимуму, чтобы объяснить проблему.
Предположим, что у нас есть следующий код:
public class Sample<T extends Sample<T>> {
public static Sample<? extends Sample<?>> get() {
return new Sample<>();
}
public static void main(String... args) {
Sample<? extends Sample<?>> sample = Sample.get();
}
}
Он компилируется без предупреждения и выполняет штраф. Однако, если кто-то попытается каким-то образом определить предполагаемый тип return new Sample<>();
в get()
явно компилятор жалуется.
До сих пор у меня создалось впечатление, что алмазный оператор - это всего лишь синтаксический сахар, чтобы не писать явные типы и, следовательно, всегда можно было заменить на какой-то явный тип. В данном примере я не смог определить какой-либо явный тип для возвращаемого значения, чтобы скомпилировать код. Можно ли явно определить общий тип возвращаемого значения или нужен бриллиант-оператор в этом случае?
Ниже приведены некоторые попытки, которые я сделал, чтобы явно определить общий тип возвращаемого значения с соответствующими ошибками компилятора.
return new Sample<Sample>
результат:
Sample.java:6: error: type argument Sample is not within bounds of type-variable T
return new Sample<Sample>();
^
where T is a type-variable:
T extends Sample<T> declared in class Sample
Sample.java:6: error: incompatible types: Sample<Sample> cannot be converted to Sample<? extends Sample<?>>
return new Sample<Sample>();
^
return new Sample<Sample<?>>
результат:
Sample.java:6: error: type argument Sample<?> is not within bounds of type-variable T
return new Sample<Sample<?>>();
^
where T is a type-variable:
T extends Sample<T> declared in class Sample
return new Sample<Sample<>>();
результаты:
Sample.java:6: error: illegal start of type
return new Sample<Sample<>>();
^