Если у вас есть Java 8 и производительность не является проблемой (что было бы в случае, если вы хотите визуализировать 10000 фигур со скоростью 60 кадров в секунду), отфильтруйте коллекцию.
Предполагая Collection<Shape> shapes
:
shapes.stream()
.filter(s -> s instanceof C)
.forEach(c -> ((C)c).m());
пь. Вы никогда не должны объявлять поведение (то есть методы) в классах или интерфейсах, которые не имеют к этому никакого отношения. В примере с ernest_k не указывайте get(int)
в интерфейсе Collection
только потому, что List
использует его. Это сохраняет структуру класса чистой и понятной. Вместо этого измените использование структуры класса, либо сложным способом (с проверкой типов и приведением типов), либо путем разделения разных подклассов в разных коллекциях (чтобы вам не приходилось проверять типы).
Если у вас было это:
Collection<A> justA;
Collection<B> justB;
Collection<C> justC;
тогда у вас не будет этой проблемы, но тогда у вас будет другая (возможно, еще хуже) проблема, что каждый раз, когда вы добавляете другой подкласс (скажем, D
), вам придется менять код повсюду, и есть риск, что вы забудете изменить его где-нибудь.