burdakovd
@burdakovd

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

Писал какую-то обобщённую жесть, и вот внезапно 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>


______________________
  • Вопрос задан
  • 2935 просмотров
Решения вопроса 1
apangin
@apangin
Какая версия JDK?
У меня javac'ом 6u20 компилируются оба варианта.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
barker
@barker
Вот так должно заработать ;)

final I ans = (I)input.transform().transform();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект