에러 해결방법

[에러] type 'List<String>' is not a subtype of type 'Set<String>' of 'function result'

개발짜 2024. 11. 16. 19:48

자료구조 선언/초기화 방법

String 타입을 갖는 Set 자료구조를 선언하고 싶다.

List 의 경우 빈 배열을 초기화할 때는 다음과 같이 선언한다.

List<String> lists = [];

 

Map 의 경우는 다음과 같다.

Map<int, String> map = {};

 

Set 도 동일하게 위와 같이 선언해서 사용했다.

The set can be declared by using the {} curly braces proceeded by a type argument, or declare the variable type Set with curly braces {}.

 

집합은 {} 중괄호를 사용해 선언하며, 타입 앞에 붙이거나 변수 타입을 Set 으로 선언하여 중괄호를 할당한다.

var setName = <type>{};  
// 또는
Set<type> setName = {};

 

주의 사항 ! var 타입의 변수에 {} 중괄호를 할당하여 초기화하면 해당 변수의 타입은 Set 이 아니라 Map 으로 인지될 것이다.

 

문제

type 'List<String>' is not a subtype of type 'Set<String>' of 'function result'

위의 내용은 List 타입은 Set 의 하위 유형이 아니므로 초기화할 수 없다는 것인데

 

진짜 문제는,

 

나는 위의 내용을 준수한 채 Set 타입의 변수를 초기화하였으나 Dart 에서 에러가 난다...

오류가 나는 코드는 다음과 같다.

Set<String> selectedSeats = {};

...

selectedSeats.add('abc');

 

오히려 Map 어쩌구 했으면 타입 지정을 안해줬다 살펴보기라도 했겠지만 나는 너무나도 명확하게 Set 타입이라고 썼다.

공식 문서를 다시 정독했으나 무슨 이유에서인지 오류가 나는지 찾지는 못했고... 해결은 했다.

 

해결

프로그램을 재실행 해보기도 했고, var 으로 선언하는 방법도 써봤으나 계속 오류가 났다. 명확한 이유도 모르겠고 버그인가.. 라고 생각할 때 쯤 그냥 Set 타입 초기화하는 방법 두 개를 붙여서 사용해봤다. 다음과 같이 중괄호 앞에도 타입을 지정해주니 잘 되었다.

Set<String> selectedSeats = <String>{};

 

정말 웃긴 점은 위에 처럼 작성해서 고쳤는데 혹시나 나 같은 사람이 있을까 싶어 블로그 쓰면서 다시 재현해보니까 재현이 안되는 거임 ㅡㅡ

진짜 버그인건지 아닌지도 알 수 없는 미지의 상태로 빠져버렸다. 캡쳐라도 할걸... 조금 억울하다.

 

참고: https://www.javatpoint.com/dart-sets

 

Dart Sets - Javatpoint

Dart Sets with What is Dart, Installation, First Program, Comments, Keywords, Data-Types, Variables, Operators, Functions, Classes, Object, Constructor, this Keyword etc.

www.javatpoint.com