Map이 아닌 값을 스프레드로 펼쳤을 때
Map이 아닌 값을 스프레드로 펼쳤을 때 (not_map_spread)
맵 리터럴에서 스프레드 요소를 썼는데, 그 표현식의 정적 타입이 Map을 구현하지 않을 때 나오는 진단이에요. 메시지는 "Spread elements in map literals must implement 'Map'." — "맵 리터럴의 스프레드 요소는 'Map'을 구현해야 해요"라고 알려줘요.
출처: not_map_spread
본문
언제 발생하나요?
맵 리터럴 안에 나타난 스프레드 요소의 표현식이, 정적 타입으로 볼 때 Map 타입을 구현하지 않으면 애널라이저가 이 진단을 만들어요. 맵을 펼치려면 그 값이 키-값 쌍을 갖는 맵이어야 하거든요.
예시
다음 코드는 l이 Map이 아니라서 이 진단이 발생해요.
var l = <String>['a', 'b'];
var m = <int, String>{...l};
l은 List<String>이라 Map이 아니에요. 맵 리터럴 안에서 ...l처럼 펼치려면 맵이어야 하는데, 리스트는 키-값 쌍을 담고 있지 않잖아요.
어떻게 고치나요?
가장 흔한 해결책은 맵을 만들어 내는 표현식으로 바꾸는 거예요. 예를 들어 리스트를 맵으로 바꾸려면 .asMap()을 쓸 수 있어요.
var l = <String>['a', 'b'];
var m = <int, String>{...l.asMap()};
.asMap()은 인덱스를 키로, 원소를 값으로 갖는 Map<int, String>을 돌려주므로 이제 맵 리터럴에서 정상적으로 펼쳐져요.
더 알아보기
- 컬렉션과 스프레드 문법은 Collections 문서에서 확인할 수 있어요.
- 다른 진단과 함께 보려면 Diagnostics 목록을 참고하세요.