"A type, grouped in angle brackets to resolve lexical ambiguity: String->String[] is parsed as Entry<String,String[]> To get Entry<String,String>[] you need to write <String->String>[]" shared class GroupedType(type) extends PrimaryType() { "The inner / wrapped type." shared Type type; shared actual [Type] children = [type]; shared actual Result transform<out Result>(Transformer<Result> transformer) => transformer.transformGroupedType(this); shared actual void visit(Visitor visitor) => visitor.visitGroupedType(this); shared actual Boolean equals(Object that) { if (is GroupedType that) { return type == that.type; } else { return false; } } shared actual Integer hash => 31 * type.hash; shared GroupedType copy(Type type = this.type) { value ret = GroupedType(type); copyExtraInfoTo(ret); return ret; } }