2012-07-09 5 views
5

ich einige Java-Code bin Portierung auf Dart und verwendet es schwer, diese Art von Karten:Karte von Klasse in Dart

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

Im Moment scheint dies in Dart unmöglich. Ich bin mir bewusst, dass es einen Vorschlag erste Ebene Typen einzuführen, ist: http://news.dartlang.org/2012/06/proposal-for-first-class-types-in-dart.html die

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

So einführen würde, bis dieser Vorschlag ich folgende Klasse erstellt haben, umgesetzt wird:

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

und die Klassen, wo ich es habe eine einfache get-Methode

abstract Type get type(); 

So kann ich meine verwenden können Type so wie ich die reale Type ein verwenden würde Um später zu wechseln, müsste ich nur meine Problemumgehung löschen.

Meine Frage: Gibt es eine Dart-Art, diese Art von Mapping zu machen (was ich nicht sehe) oder ist es eine vernünftige Lösung, bis die echte Type Klasse eingeführt wird?

Update für Dart 1.0

Es kann auf diese Weise geschehen:

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

Antwort

4

aktualisieren: Diese Konstruktion ist nicht machbar in Dart

Map<Class<? extends SomeClass>, SomeOtherClass> 

Sie haben warten auf .type/.class zu arriv e für eine elegante Lösung (viele von uns Dartisans hoffen, dass dies eher früher als später ankommen wird). Doch für den einfacheren Fall

Map<? extends SomeClass, SomeOtherClass> 

Sie können tun, nur

Map<SomeClass, SomeOtherClass> aMap; 

wie in Dart jede Klasse, die Someclass wird auch sein würde eine gültige Someclass erstreckt. Wenn Sie zum Beispiel den folgenden Code in geprüft Modus ausgeführt:

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; 
} 

dann werden Sie Sie den Fehler:

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

in Ihrem Beispiel der Schlüssel in der Karte ist eine Instanz der Klasse Test, aber Ich brauche die Klasse, um der Schlüssel zu sein, nicht die Instanz .. oh ich sehe, mein Java-Code ist falsch –

+1

meine Frage aktualisiert .. –