2016-08-27 9 views
1

Dartではこれらの2つのインスタンス化は同等ですか?Dartジェネリッククラスのインスタンス化

//version 1 
Map<String, List<Component>> map = new Map<String, List<Component>>(); 

//version 2 
Map<String, List<Component>> map = new Map(); //type checker doesn't complain 

バージョン2を使用して問題はありますか(これはあまり冗長ではないので好きです)。

var map = new Map<String, List<Component>>(); 

をが、これは、私はこの質問に直面したいポイントではありません。

私は、私が使用できることを知っていることに注意してください。ありがとう。

+0

を見ることができます強力なモードは、ダート・アナライザは、種類については特に好き嫌いではないようです。プロダクションモードで実行すると、アノテーションは完全に無視されます。 –

+0

「強モード」を有効にしましたが、とにかく「新しいマップ()」にエラーや警告は表示されません。それは私の質問に答えません。 https://pub.dartlang.org/packages/analyzerという便利なリンクをここで「強モード」にする方法が不思議に思う人は、 – user1756508

答えて

3

これらは同等ではありませんが、インスタンス化の実行時のタイプが異なり、ランタイムタイプ(タイプチェックなど)で動作するコードに驚きが生じることがあります。

new Map()は、new Map<dynamic, dynamic>()へのショートカットであり、「任意のものをマッピングする」ことを意味します。

main(List<String> args) { 
    //version 1 
    Map<String, List<int>> map1 = new Map<String, List<int>>(); 
    //version 2 
    Map<String, List<int>> map2 = new Map(); // == new Map<dynamic, dynamic>(); 

    // runtime type differs 
    print("map1 runtime type: ${map1.runtimeType}"); 
    print("map2 runtime type: ${map2.runtimeType}"); 

    // type checking differs 
    print(map1 is Map<int, int>); // false 
    print(map2 is Map<int, int>); // true 

    // result of operations the same 
    map1.putIfAbsent("onetwo",() => [1, 2]); 
    map2.putIfAbsent("onetwo",() => [1, 2]); 
    // analyzer in strong mode complains here on both 
    map1.putIfAbsent("threefour",() => ["three", "four"]); 
    map2.putIfAbsent("threefour",() => ["three", "four"]); 

    // content the same 
    print(map1); 
    print(map2); 
} 

アップデート1:一緒にプレイするDartPadのコード

テストは少し元のインスタンスを変更しました。

アップデート2:それは、将来におけるMAP2のインスタンス文句を言うあなたは強いモードを有効にしない場合https://github.com/dart-lang/sdk/issues/24712

関連する問題