В Java есть способ бросить следующее:Внутренний литой элементов коллекции
ArrayList<IMyType> list
в
ArrayList<MyType>
если
MyType implements IMyType
?
В Java есть способ бросить следующее:Внутренний литой элементов коллекции
ArrayList<IMyType> list
в
ArrayList<MyType>
если
MyType implements IMyType
?
Если вы уверены, что все IMyType
s в List
являются MyType
, вы можете принудительно назначение переменной бесконтрольно тип преобразования:
List<IMyType> l1;
List rawList = l1;
List<MyType> l2 = rawList;
Или
List<IMyType> l1;
List<MyType> l2 = (List) l1;
Примечание: при извлечении элемента изэто приведет к возникновению (например, итерация в цикле [улучшенного] for
), и это не MyType
.
Имейте в виду, что это скорее взломать, чем правильное решение, и полностью обходит безопасность типов (что в основном связано с дженериками).
Это может быть намек на то, что что-то не совсем верно при моделировании классов и/или в том, как они используются.
Большое спасибо .. Это именно то, что я искал. Благодарим вас за советы относительно безопасности типов. Моя особая проблема заключается в том, что я получаю ArrayList из метода Java RMI, который имеет тип 'ArrayList
Кстати: ваше третье предложение от вас не работает;) –
Нет, это потому, что ArrayList<MyType>
не является под-типом ArrayList<IMyType>
. Только MyType
- это подтип IMyType
. Что вы можете сделать, это вы можете итерируете ArrayList<IMyType>
и получить IMyType
объект, а затем введите бросайте его MyType
например, как
IMyType iMyType = ..
MyType myType = (MyType)iMyType;
поэтому единственный способ получить 'ArrayList
Я обновил свой ответ :) Да, это единственный способ. – Keerthivasan
Вы можете попробовать это. Вы не можете напрямую наложить ArrayList
. Вы можете бросить один на один
ArrayList<IMyType> list=new ArrayList<IMyType>();
ArrayList<MyType> list2=new ArrayList<MyType>();
for(IMyType i:list){
list2.add((MyType)i);
}
Вы можете сделать бросок в этом случае: (Inteder
расширяет Number
)
List<IMyType> list1 = new ArrayList<>();
List<? extends IMyType> list2 = new ArrayList<>();
list2 = list1;
Если вы абсолютно уверены, что ваш list
содержит только экземпляры MyType
(или его подтипов), то вы можете сделать что-то вроде
@SuppressWarnings("unchecked")
List<MyType> myList = (List<MyType>) (List<?>) list;
Это будет ваш личный список IMyType
в список любого типа <?>
, который затем вы можете отличить до более точного типа. Но обязательно используйте его, только если ваш list
содержит экземпляры MyType
и ничего больше.
В любом случае этот подход используется очень редко и в большинстве случаев могут быть заменены
List<? extends IMytype>
или
List<? super MyType>
хучь .. который оставил -1? :) –
[лучший способ понять эту концепцию] (http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitlyp). BWT Я не спустил – sanbhat
@sanbhat благодарит вас за ваши советы ... –