Как отмечалось в другом ответе, вы можете сделать это как Map, в противном случае вы также можете расширить коллекцию самостоятельно - это, к сожалению, не позволяет вам использовать, например.Перечислите интерфейс, чтобы вызвать его, но он работает, если вы используете сам класс.Это будет выглядеть примерно так:
class InstanceArrayList<T> extends ArrayList<T>
{
public <V> V get(Class<V> instanceClass){
return (V) this.stream()
.filter( e -> e.getClass().equals( instanceClass ) )
.findFirst()
.orElse( null );
}
public <V> V get(Class<V> instanceClass, int index){
return (V) this.stream()
.filter( e -> e.getClass().equals( instanceClass ) )
.skip( index ).findFirst()
.orElse( null );
}
}
Он будет предупреждать вас о непроверенном приведении - но мы можем игнорировать его безопасно, так как мы уже знаем, что тип объекта соответствует.
И тогда вы можетепросто используйте его так:
public static void main( String[] args )
{
InstanceArrayList<A> it = new InstanceArrayList<>();
it.add( new A() );
it.add( new A() );
it.add( new B() );
it.add( new B() );
it.add( new C() );
it.add( new C() );
System.out.println(it.get( A.class ));
System.out.println(it.get( A.class, 1 ));
System.out.println(it.get( B.class ));
System.out.println(it.get( B.class, 1 ));
System.out.println(it.get( C.class ));
System.out.println(it.get( C.class, 1 ));
}
Если вы не хотите, чтобы он возвращал дочерний класс, вы также можете легко сделать так, чтобы он возвращал T (суперкласс).