2015-12-04 1 views
1

У меня есть два объекта A и B. Где B является расширением А.Проверка для экземпляра суб-класса в списке и возвращает объект

и у меня есть список, который может содержать в качестве и Bs

и у меня есть метод, который идет что-то вроде:

B findB() 
{ 
    for (int i = 0; i < ABlist.size(); i++) 
    { 
     if(ABlist.get(i) instanceof B) 
     { 
       return ABlist.get(i); 
     } 
     else{return null;} 
    } 
    return null; 
} 

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

Как был бы лучший способ решить эту проблему?

+1

Вам нужно передать результат 'get (i)'. У вас не должно быть этого 'else'. Вы также должны использовать итератор вместо индексов. –

+0

Кроме того, не возвращайте 'null' в' else', просто удалите 'else' целиком. С предложением @SotiriosDelimanolis этот код вернет непустой экземпляр 'B', если он окажется первым в списке. –

+0

@SotiriosDelimanolis, который сработал, спасибо. –

ответ

-1

Вместо того чтобы делать instanceof, вы можете добавить метод класса и его подклассов, который возвращает this для конкретного подкласса и null для других подклассов. Как это:

class A { 
    public A get() { 
    return null; 
    } 
} 
class B extends A { 
    @Override 
    public A get() { 
    return this; 
    } 
} 
... 
B findB() { 
    for (A a : ABlist) { 
     if (a.get() != null) { 
      return (B) a; 
     } 
    } 
    return null; 
} 

Идея заключается в том, чтобы избежать instanceof использования, если это возможно. Этот оператор является частью языка, но широкое использование рефлексии и instanceof могут сделать ваше приложение медленным и неподъемным.

Смежные вопросы