Элемент Cast в Java Для каждого утверждения

Возможно ли (или даже целесообразно) лить элемент, полученный из a для каждого утверждения в самом заявлении? Я знаю, что каждый элемент в списке будет иметь тип .

IE:

 List list = DAO.getList(); for( element : list){ // Cannot convert from element type  to  ... } 

скорее, чем:

 List  list = DAO.getList(); for( el : list){  element = ()el; ... } 

Вы действительно знаете, что каждая запись будет подтипом? DAO просто должен выполнить контракт List , и если вы принимаете подclass, то я думаю, что-то где-то не так. Я, возможно, сконцентрируюсь на правильном использовании интерфейса для DAO, и пусть он по контракту вернет то, что вы хотите.

По всем причинам, указанным другими, вы не должны этого делать. Однако, если вы не можете изменить интерфейс, возможно следующее:

 for (BaseType element : list) { SubType subType = (SubType)element; ... } 

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

Я понимаю, что это НЕ ТОЧНО, что вы искали, но он справляется с кастингом.

Фактически возможно комбинировать трансляцию с циклом for, например:

 List list = DAO.getList(); for (SubType subType : ((List) list)){ ... } 

Или вы можете использовать этот слегка чистый рисунок:

 List list = (List) DAO.getList(); for (SubType subType : list){ ... } 

Вы получите предупреждение о немедленном предупреждении от компилятора Java, если только вы его не подавите. Эффект первой формы будет фактически идентичен тому, чтобы различать каждый элемент внутри цикла. Вторая форма также предусматривает, что новые дополнения к списку должны соответствовать SubType.

Обратите внимание, что это НЕ будет работать с массивами, поскольку массивы имеют разные типы времени выполнения. Другими словами, BaseType [] не поддается SubType []. Вы можете использовать API массивов, чтобы обойти это, например:

 BaseType[] array = DAO.getArray(); for (SubType subType : Arrays.asList(array)) { ... } 

Возможно, да! но не дай бог, почему? Мои ранние попытки в моей карьере сделали это, и я узнал. Преимущество программирования на интерфейсах всегда имеет преимущество. Я всегда получаю вопросы от младших разработчиков по поводу обработки случаев, когда только подтипы имеют необходимые методы / функциональные возможности.

Скажите class Animal с подтипом Dog, имеющим метод bark (). Им нужна функция bark (). Реальная проблема заключается в том, что они хотят, чтобы поведение общения с животными не было лаем (), но животное говорило (). Таким образом, новый class подкатегории Cat не потребует мяу (). А вот тогда: – Моя собака сформировала пачку, но кошек этого нет. Поведение в виде ответа () не принадлежит одной собаке. Pack – это другой аспект, передать пакет всем объектам и попросить объекты присоединиться к пакету. (Шаблон посетителя / шаблон адаптера). Класс My Wolf может использовать одно и то же поведение.

Я жестко об этом, нет, если это всего лишь 1 случай, я в порядке. Если я не уверен, тогда вам лучше играть безопасно, работая по контрактам интерфейса.

Если вы не являетесь частью коллекций Google, вы можете обернуть список с помощью метода transform . В вашем случае он будет очень эффективным и полностью совместимым. Я бы сказал, что это метод обертки, как предложил Брайан.

 public List< SubType > fromDao ( ) { // Put a comment for maintainer // Lists from DAO always contain SubTypes return Lists.transform( DAO.getList( ), new Function< BaseType, SubType >( ) { public SubType apply ( final BaseType from ) { return (SybType) from; } }; }