Basically this is because AbstractArray is a parametric abstract type, and when subtyping one, you need to account for all the parameters. If you didn’t, the supertype would be ambiguous (is mylist2 a subtype of both AbstractArray{Int32, 1} and AbstractArray{Int32, 3}?). So, struct mylist2{N} <: AbstractArray{Int32, N} end or struct mylist2 <: AbstractArray{Int32, 1} end would work.
Also, Array{Int32} isn’t a concrete type, the implicit dimensions parameter N is not specified so it’s a parametric composite type, which is an abstract type representing a set of concrete types. The difference from a parametric abstract type is that when you specify all the parameters, you must get a concrete type like Array{Int32, 2}, whereas AbstractArray{Int32, 2} is still abstract. You probably can infer this, but struct mylist2{N} <: Array{Int32, N} end would not work because a concrete mylist2{1} cannot be a subtype of a concrete Array{Int32, 1}.