org.gradle.api

## Interface PolymorphicDomainObjectContainer<T>

- Type Parameters:
    `T` - the (base) type of domain objects in the container
  All Superinterfaces:
    Collection<T>, org.gradle.util.Configurable<NamedDomainObjectContainer<T>>, DomainObjectCollection<T>, Iterable<T>, NamedDomainObjectCollection<T>, NamedDomainObjectContainer<T>, NamedDomainObjectSet<T>, Set<T>
  All Known Subinterfaces:
    AuthenticationContainer, BinaryContainer, ExtensiblePolymorphicDomainObjectContainer<T>, org.gradle.api.internal.ExtensiblePolymorphicDomainObjectContainerInternal<T>, FunctionalSourceSet, NativeToolChainRegistry, PlatformContainer, PlayDistributionContainer, org.gradle.api.internal.PolymorphicDomainObjectContainerInternal<T>, PublicationContainer, Repositories, TaskContainer

      @Incubating
      public interface PolymorphicDomainObjectContainer<T>
      extends NamedDomainObjectContainer<T>

  A `NamedDomainObjectContainer` that allows to create domain objects with different types.

- - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `<U extends T> NamedDomainObjectContainer<U>` | `containerWithType(Class<U> type)` Creates a regular container that wraps the polymorphic container presenting all elements of a specified type.
    `<U extends T> U` | `create(String name, Class<U> type)` Creates a domain object with the specified name and type, and adds it to the container.
    `<U extends T> U` | `create(String name, Class<U> type, Action<? super U> configuration)` Creates a domain object with the specified name and type, adds it to the container, and configures it with the specified action.
    `<U extends T> U` | `maybeCreate(String name, Class<U> type)` Looks for an item with the given name and type, creating and adding it to this container if it does not exist.

    - ### Methods inherited from interface org.gradle.api.NamedDomainObjectContainer

      `configure, create, create, create, maybeCreate`

    - ### Methods inherited from interface org.gradle.api.NamedDomainObjectSet

      `findAll, matching, matching, withType`

    - ### Methods inherited from interface org.gradle.api.NamedDomainObjectCollection

      `add, addAll, addRule, addRule, findByName, getAsMap, getAt, getByName, getByName, getNamer, getNames, getRules`

    - ### Methods inherited from interface org.gradle.api.DomainObjectCollection

      `all, all, whenObjectAdded, whenObjectAdded, whenObjectRemoved, whenObjectRemoved, withType, withType`

    - ### Methods inherited from interface java.util.Collection

      `clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray`

    - ### Methods inherited from interface java.util.Set

      `add, addAll, clear, contains, containsAll, equals, hashCode, isEmpty, iterator, remove, removeAll, retainAll, size, toArray, toArray`

- - ### Method Detail

    - #### create

          <U extends T> U create(String name,
                               Class<U> type)
                             throws InvalidUserDataException

      Creates a domain object with the specified name and type, and adds it to the container.
      Type Parameters:
        `U` - the type of the domain object to be created
      Parameters:
        `name` - the name of the domain object to be created
        `type` - the type of the domain object to be created
      Returns:
        the created domain object
      Throws:
        `InvalidUserDataException` - if a domain object with the specified name already exists or the container does not support creating a domain object with the specified type

    - #### maybeCreate

          @Incubating
          <U extends T> U maybeCreate(String name,
                                               Class<U> type)
                                  throws InvalidUserDataException

      Looks for an item with the given name and type, creating and adding it to this container if it does not exist.
      Type Parameters:
        `U` - the type of the domain object to be created
      Parameters:
        `name` - the name of the domain object to be created
        `type` - the type of the domain object to be created
      Returns:
        the found or created domain object, never `null`.
      Throws:
        `InvalidUserDataException` - if the container does not support creating a domain object with the specified type
        `ClassCastException` - if a domain object with the specified name exists with a different type

    - #### create

          <U extends T> U create(String name,
                               Class<U> type,
                               Action<? super U> configuration)
                             throws InvalidUserDataException

      Creates a domain object with the specified name and type, adds it to the container, and configures it with the specified action.
      Type Parameters:
        `U` - the type of the domain object to be created
      Parameters:
        `name` - the name of the domain object to be created
        `type` - the type of the domain object to be created
        `configuration` - an action for configuring the domain object
      Returns:
        the created domain object
      Throws:
        `InvalidUserDataException` - if a domain object with the specified name already exists or the container does not support creating a domain object with the specified type

    - #### containerWithType

          <U extends T> NamedDomainObjectContainer<U> containerWithType(Class<U> type)

      Creates a regular container that wraps the polymorphic container presenting all elements of a specified type.
      Type Parameters:
        `U` - the type of the container elements
      Parameters:
        `type` - the type of the container elements
      Returns:
        a `NamedDomainObjectContainer` providing access to elements of type U.