 /**
 A `MultiPolygon` is a `GeometryCollection` of `Polygon`s.
 */
-open class MultiPolygon<T: Polygon> : GeometryCollection<Polygon> {
+open class MultiPolygon<T: Polygon> : GeometryCollection<T> {
     open override class func geometryTypeId() -> Int32 {
         return 6 // GEOS_MULTIPOLYGON
     }
-    public convenience init?(polygons: Array<Polygon>) {
+    public convenience init?(polygons: [T]) {
         let coordsPointer = UnsafeMutablePointer<OpaquePointer?>.allocate(capacity: polygons.count)
         defer { coordsPointer.deallocate(capacity: polygons.count) }
         for (i, geom) in polygons.enumerated() {

/**
A `MultiLineString` is a `GeometryCollection` of `LineStrings`.
*/
open class MultiLineString<T: LineString> : GeometryCollection<LineString> {
    
    open override class func geometryTypeId() -> Int32 {
        return 5 // GEOS_MULTILINESTRING
    }

    public convenience init?(linestrings: Array<LineString>) {
        let geometriesPointer = UnsafeMutablePointer<OpaquePointer?>.allocate(capacity: linestrings.count)
        defer { geometriesPointer.deallocate(capacity: linestrings.count) }
        for (i, geom) in linestrings.enumerated() {

    /**
    - returns: An Array of geometries in this GeometryCollection.
     */
    public convenience init?(geometries: [T]) {
        let geometriesPointer = UnsafeMutablePointer<OpaquePointer?>.allocate(capacity: geometries.count)
        defer { geometriesPointer.deallocate(capacity: geometries.count) }
        for (i, geom) in geometries.enumerated() {
