Я думаю, вам придется немного переделать здесь.Компилятор предупреждает вас о серьезной проблеме безопасности типов в вашем коде, и если вы не исправите ее должным образом, он, вероятно, вернется, чтобы укусить вас.
У вас есть List
преобразователей,но вы не можете сказать, что каждый может преобразовать;каждый из них реализует ConverterInterface<T>
для некоторого типа T
, но вы не знаете, что такое T
для какого-либо конкретного элемента в списке.
testList[0]
(при условиив списке есть хотя бы один элемент) может реализовываться ConverterInterface<String>
, или ConverterInterface<Int>
, или ConverterInterface<Map<URL, LinkedList<LinearGradientPaint>>
, или что-либо еще.Так что testList[0].realSender("")
небезопасно, потому что он может не принимать String.
Вот почему компилятор жалуется;он ничего не знает о соответствующем типе, поэтому должен принять наихудший случай и запретить вызов.В противном случае вы рискуете ClassCastException
во время выполнения, когда преобразователь не сможет обработать тип передаваемого вами параметра.
Еще хуже, из-за стирания типа вы не сможете найти этот тип ввремя выполнения, либо.(Во время выполнения, после того, как компилятор сделал свое волшебство, есть только простой ConverterInterface
.)
Кстати, ответ с realSender()
не решает эту проблему, просто сообщая компиляторузаткнись об этом.Он все еще будет кусать вас во время выполнения.
Так что я думаю, вам нужно более тщательно подумать о том, чего вы пытаетесь достичь здесь.
Почему вы храните эти конвертеры вlist, и зачем вам доступ к ним таким образом?
Если вы знаете, что каждая реализация сможет принимать строки, тогда сделайте список List<ConverterInterface<String>>
: компилятор будет гарантировать, что все в спискеможет принимать строки, и вы можете безопасно передать строку любому конвертеру в списке.
Но если список может содержать конвертеры различных типов, то как вы узнаете, что конвертер, на который вы смотрите, можетвзять какой-то конкретный тип?Даже если код работает на данный момент, есть риск, что дополнительный элемент будет добавлен в список позже, и все испортится.Таким образом, вам придется отслеживать другой путь.И этот другой способ, вероятно, даст вам лучший (безопасный) способ доступа к ним.