2012-07-09 3 views
5

に私は、DARTするためにいくつかのJavaコードを移植していますし、それが重くマップのこれらの種類を使用しています。地図はダート

Map<Class<? extends SomeClass>, SomeOtherClass> map = new HashMap<>(); 

現時点ではこれがダーツでは不可能であると思われます。 http://news.dartlang.org/2012/06/proposal-for-first-class-types-in-dart.htmlこの提案が実装されるまでだから私が作成した以下のクラス

class Type { 
    @native String toString(); 
    String descriptor(){...} // return the simple name of the type 
} 

をご紹介します:

class Type { 
    final String classname; 
    const Type(this.classname); 
    String descriptor() => classname; 
} 

と私は必要なクラスIは、最初のレベルのタイプを導入する案があることを承知していますそれは私が私のType私が使用するのと同じように、実際のType使用することができ、単純なGET-方法

abstract Type get type(); 

その方法を持っています私の回避策を削除する必要があります。

私の質問:実際のTypeクラスが導入されるまでは、このようなマッピング(これは私が見ていない)や合理的な回避策を実行する方法がありますか?あなたが持っているでしょうこの構造はダート

現在なんとかではありません
Map<Class<? extends SomeClass>, SomeOtherClass> 

それは、この方法を行うことができダート1.0

の更新:

var map = new Map<Type, SomeOtherClass>(); 
// either 
map[SomeOtherClass] = new SomeOtherClass(); 
// or 
var instance = new SomeOtherClass(); 
map[instance.runtimeType] = instance; 

答えて

4

更新.type/.classが到着するまで待つe(これは私たちの多くが後でより早く到着することを期待しています)。しかし、単純なケース

Map<? extends SomeClass, SomeOtherClass> 

のためのあなただけのダートのよう

Map<SomeClass, SomeOtherClass> aMap; 

を行うことができます 工assを拡張するすべてのクラスは、有効な 工assになるだろう。あなたがチェックモードで次のコード実行した場合たとえば:

main() { 
    Map<Test, String> aMap = new HashMap<Test, String>(); 
    var test = new Test("hello"); 
    var someTest = new SomeTest("world"); 
    var notATest = new NotATest(); 

    aMap[test] = test.msg; 
    aMap[someTest] = someTest.msg; 
    aMap[notATest] = "this fails"; 
} 

class Test implements Hashable { 
    Test(this.msg); 

    int hashCode() => msg.hashCode(); 

    final String msg; 
} 

class SomeTest extends Test { 
    SomeTest(String message): super(message); 
} 

class NotATest implements Hashable { 
    int hashCode() => 1; 
} 

を、あなたはエラーが発生します:

type 'NotATest' is not a subtype of type 'Test' of 'key'. 
+0

あなたの例ではマップ内のキーは、クラスTestのインスタンスですが、私はキーが、インスタンスではありませんクラスが必要です..ああ私が参照してください、私のJavaコードが間違っている –

+1

私の質問を更新.. –