Писал какую-то обобщённую жесть, и вот внезапно Java отказалась компилить код, хотя казалось бы всё нормально.
Вкратце, что тут происходит:
Transformable — параметризованный интерфейс, параметризован он для того, чтобы реализующие классы могли указать тип результата трансформации.
Метод test накладывает ограничение на тип передаваемого объекта, которые на человеческий язык можно перевести как «объект input содержит метод transform, с возвращаемым значением типа «какой-то подтип I»»
Таким образом transform () вернёт объект, совместимый с типом I. И у возвращённого объекта можно снова вызвать метод transform ().
Если я делаю это через промежуточные переменные, то всё работает, а в одну строку — не компилируется, хотя суть то не меняется.
Что не так?
<font color="black"><ol>
<li> </li>
<li><font color="#000000"><b>class</b></font> Main <font color="#009900">{</font></li>
<li> </li>
<li> <font color="#008000"><i><b>/**</b></i></font></li>
<li><font color="#008000"><i><b> * @param <T></b></i></font></li>
<li><font color="#008000"><i><b> * transformation result type</b></i></font></li>
<li><font color="#008000"><i><b> * </b></i></font></li>
<li><font color="#008000"><i><b> */</b></i></font></li>
<li> <font color="#000000"><b>public</b></font> <font color="#000000"><b>interface</b></font> Transformable<font color="#339933"><</font>T <font color="#000000"><b>extends</b></font> Transformable<font color="#339933"><?>></font> <font color="#009900">{</font></li>
<li> T transform<font color="#009900">(</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#339933"><</font>I <font color="#000000"><b>extends</b></font> Transformable<font color="#339933"><?</font> <font color="#000000"><b>extends</b></font> I<font color="#339933">>></font> I test<font color="#009900">(</font><font color="#000000"><b>final</b></font> I input<font color="#009900">)</font> <font color="#009900">{</font></li>
<li> </li>
<li> <font color="#000000"><b>final</b></font> I ans <font color="#339933">=</font> input.<font color="#006633">transform</font><font color="#009900">(</font><font color="#009900">)</font>.<font color="#006633">transform</font><font color="#009900">(</font><font color="#009900">)</font><font color="#339933">;</font> <font color="#666666"><i>// can't compile!</i></font></li>
<li> </li>
<li> <font color="#666666"><i>// final I ans1 = input.transform();</i></font></li>
<li> <font color="#666666"><i>// final I ans = ans1.transform(); // works!</i></font></li>
<li> </li>
<li> <font color="#000000"><b>return</b></font> ans<font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li><font color="#009900">}</font></li>
<li> </li>
<li> </li>
</ol></font>
______________________