Сведения о вопросе

PIRLO

16:38, 27th August, 2020

Теги

Java    

Странное поведение generics в Java?

Просмотров: 313   Ответов: 2

Писал какую-то обобщённую жесть, и вот внезапно Java отказалась компилить код, хотя казалось бы всё нормально.


Вкратце, что тут происходит:


Transformable — параметризованный интерфейс, параметризован он для того, чтобы реализующие классы могли указать тип результата трансформации.


Метод test накладывает ограничение на тип передаваемого объекта, которые на человеческий язык можно перевести как «объект input содержит метод transform, с возвращаемым значением типа «какой-то подтип I»»


Таким образом transform () вернёт объект, совместимый с типом I. И у возвращённого объекта можно снова вызвать метод transform ().


Если я делаю это через промежуточные переменные, то всё работает, а в одну строку — не компилируется, хотя суть то не меняется.


Что не так?

<font color="black"><ol>
<li>&nbsp;</li>
<li><font color="#000000"><b>class</b></font> Main <font color="#009900">{</font></li>
<li>&nbsp;</li>
<li>&nbsp; &nbsp; <font color="#008000"><i><b>/**</b></i></font></li>
<li><font color="#008000"><i><b>&nbsp; &nbsp; &nbsp;* @param &lt;T&gt;</b></i></font></li>
<li><font color="#008000"><i><b>&nbsp; &nbsp; &nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transformation result type</b></i></font></li>
<li><font color="#008000"><i><b>&nbsp; &nbsp; &nbsp;* </b></i></font></li>
<li><font color="#008000"><i><b>&nbsp; &nbsp; &nbsp;*/</b></i></font></li>
<li>&nbsp; &nbsp; <font color="#000000"><b>public</b></font> <font color="#000000"><b>interface</b></font> Transformable<font color="#339933">&lt;</font>T <font color="#000000"><b>extends</b></font> Transformable<font color="#339933">&lt;?&gt;&gt;</font> <font color="#009900">{</font></li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; T transform<font color="#009900">(</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li>&nbsp; &nbsp; <font color="#009900">}</font></li>
<li>&nbsp;</li>
<li>&nbsp; &nbsp; <font color="#339933">&lt;</font>I <font color="#000000"><b>extends</b></font> Transformable<font color="#339933">&lt;?</font> <font color="#000000"><b>extends</b></font> I<font color="#339933">&gt;&gt;</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>&nbsp;</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; <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>&nbsp;</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; <font color="#666666"><i>// final I ans1 = input.transform();</i></font></li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; <font color="#666666"><i>// final I ans = ans1.transform(); // works!</i></font></li>
<li>&nbsp;</li>
<li>&nbsp; &nbsp; &nbsp; &nbsp; <font color="#000000"><b>return</b></font> ans<font color="#339933">;</font></li>
<li>&nbsp; &nbsp; <font color="#009900">}</font></li>
<li>&nbsp;</li>
<li><font color="#009900">}</font></li>
<li>&nbsp;</li>
<li>&nbsp;</li>
</ol></font>


______________________



  Сведения об ответе

JUST___

18:25, 11th August, 2020

Какая версия JDK?
У меня javac'ом 6u20 компилируются оба варианта.


  Сведения об ответе

dumai

06:37, 16th August, 2020

Вот так должно заработать ;)

final I ans = (I)input.transform().transform();


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться