class Range { final T from; final T to; num get magnitude => to - from; Range(this.from, this.to); factory Range.fromList(List list) { assert(list.length == 2); return Range(list.first, list.last); } } // Extension on Iterable> is not allowed. Error given: // The name 'T' isn't a type, so it can't be used as a type argument. extension RangeOfRanges on Iterable> { Range range() { final min = (map((range) => range.from).toList()..sort()).first; final max = (map((range) => range.to).toList()..sort()).last; return Range(min, max); } } void main() { final intRange = Range(-3, 6); print(intRange.magnitude); print(intRange.magnitude.runtimeType); // int, all good so far final rangeList = >[ Range(3.5, 5.3), Range(6.3, 9.2), Range(-3.0, 13.1), ]; final rangeOfRanges = rangeList.range(); // I want to call a function that accepts Range. print(rangeOfRanges.runtimeType); // Range :( final nastyWorkaround = Range( rangeOfRanges.from.toDouble(), rangeOfRanges.to.toDouble() ); print(nastyWorkaround.runtimeType); // Finally: Range }