2014-05-29 1 views
2

다트에 대한 유형 확인 작동 방식에 대해 혼란스러워하고 있습니다. 그림과 같이 일반 List<dynamic>List<String>에 할당하면됩니다. 즉, String이 아닌 그 목록에있는 콘텐츠를 지정할 수 있다는 것을 의미합니다. 왜 그런가요?리스트 <dynamic>을리스트 <String>에 지정할 수있는 이유는 무엇입니까?

void main() { 
    List<String> a; 
    a = [1];     // pass 
    a = new List<int>();  // fail 
    a = 1;     // fail 
    a = new List<String>(); // pass 
    a.add(1);    // fail 
} 
+0

선언 및 재 정의가 다른 서명/데이터 유형을 나타내지 않아야합니다. 동적 인 경우에도 동일한 유형의 내용이 있어야하며 여러 데이터 유형의 내용을 목록 인스턴스에 병합 할 수 없습니다. 멀티 타입 데이터를 원한다면 ArrayList를 사용할 수 있습니다. –

답변

4

dynamic 유형은 특별하다. 그것은 정말로 "이것에 대한 모든 유형 검사를 끄십시오, 나는 무엇을하고 있는지"를 의미합니다.

예를 들어, 변수에 List<dynamic> 인스턴스를 할당합니다. 정적 유형 검사기는 목록에 나열됩니다. 괜찮습니다. 형식 매개 변수가 동적이므로 프로그래머가 자신이 수행하고 있음을 알아야합니다.

dynamic을 유형으로 사용하거나 유형의 일부로 사용할 때마다 입력 내용이 정확하다는 전적인 책임을집니다. 시스템은 당신이 원하는대로 할 수있게 해줍니다.

dynamic이 없어도 다트 유형 시스템은 안전이 아닙니다. 즉, 런타임에 유형 오류로 실패하는 정적 유형 경고가없는 프로그램을 작성할 수 있습니다. 대부분의 언어에는 공동 또는 대조 형 하위 유형이있는 매개 변수가있는 유형이 포함되는 즉시 실제로 문제가 있습니다. 또는 캐스트.

+0

감사합니다. 나는 그 다이나믹이 타입 검사를 의미하지 않는다는 것을 알지 못했다. 대신리스트'''에'List '을 할당하려고하면 정적 유형 검사기가 원하는대로 불평합니다. 'Object'와'dynamic'의 구분은 혼란 스럽습니다. – tusj

+1

@ tusj 주제에 대한 좋은 읽을 거리 : https://www.dartlang.org/articles/optional-types/ –

관련 문제