2014-01-30 4 views
-1

В Java есть способ бросить следующее:Внутренний литой элементов коллекции

ArrayList<IMyType> list

в

ArrayList<MyType>

если

MyType implements IMyType

?

+0

хучь .. который оставил -1? :) –

+0

[лучший способ понять эту концепцию] (http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitlyp). BWT Я не спустил – sanbhat

+1

@sanbhat благодарит вас за ваши советы ... –

ответ

1

Если вы уверены, что все IMyType s в List являются MyType, вы можете принудительно назначение переменной бесконтрольно тип преобразования:

List<IMyType> l1; 
List rawList = l1; 
List<MyType> l2 = rawList; 

Или

List<IMyType> l1; 
List<MyType> l2 = (List) l1; 

Примечание: при извлечении элемента изэто приведет к возникновению (например, итерация в цикле [улучшенного] for), и это не MyType.

Имейте в виду, что это скорее взломать, чем правильное решение, и полностью обходит безопасность типов (что в основном связано с дженериками).

Это может быть намек на то, что что-то не совсем верно при моделировании классов и/или в том, как они используются.

+0

Большое спасибо .. Это именно то, что я искал. Благодарим вас за советы относительно безопасности типов. Моя особая проблема заключается в том, что я получаю ArrayList из метода Java RMI, который имеет тип 'ArrayList '. Затем я хочу использовать этот список, но без ссылки на RMI-тип (это 'IMyTxpe') и вместо этого использовать внутреннее представление элементов списка - это' MyType'. –

+1

Кстати: ваше третье предложение от вас не работает;) –

1

Нет, это потому, что ArrayList<MyType> не является под-типом ArrayList<IMyType>. Только MyType - это подтип IMyType. Что вы можете сделать, это вы можете итерируете ArrayList<IMyType> и получить IMyType объект, а затем введите бросайте его MyType например, как

IMyType iMyType = .. 

MyType myType = (MyType)iMyType; 
+0

поэтому единственный способ получить 'ArrayList ' - это перебрать все элементы и сделать литье? –

+0

Я обновил свой ответ :) Да, это единственный способ. – Keerthivasan

0

Вы можете попробовать это. Вы не можете напрямую наложить ArrayList. Вы можете бросить один на один

ArrayList<IMyType> list=new ArrayList<IMyType>(); 
ArrayList<MyType> list2=new ArrayList<MyType>(); 
for(IMyType i:list){ 
    list2.add((MyType)i); 
} 
0

Вы можете сделать бросок в этом случае: (Inteder расширяет Number)

List<IMyType> list1 = new ArrayList<>(); 
List<? extends IMyType> list2 = new ArrayList<>(); 

list2 = list1; 
5

Если вы абсолютно уверены, что ваш list содержит только экземпляры MyType (или его подтипов), то вы можете сделать что-то вроде

@SuppressWarnings("unchecked") 
List<MyType> myList = (List<MyType>) (List<?>) list; 

Это будет ваш личный список IMyType в список любого типа <?>, который затем вы можете отличить до более точного типа. Но обязательно используйте его, только если ваш list содержит экземпляры MyType и ничего больше.

В любом случае этот подход используется очень редко и в большинстве случаев могут быть заменены

List<? extends IMytype> 

или

List<? super MyType> 
Смежные вопросы