2012-07-09 14 views
5

sto porting alcuni Java-codice per dardo e utilizza pesantemente questi tipi di mappe:Map da Class a Dart

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

Al momento questo sembra essere impossibile in dardo. Sono consapevole che c'è una proposta di introdurre primi tipi di livello: http://news.dartlang.org/2012/06/proposal-for-first-class-types-in-dart.html tali da introdurre

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

Così fino a quando questa proposta viene attuata ho creato seguenti classi:

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

e le classi in cui ho bisogno ha un semplice get-metodo

abstract Type get type(); 

In questo modo posso utilizzare il mio Type proprio come avrei usato il vero Type un d per passare più tardi dovrei solo cancellare la mia soluzione alternativa.

La mia domanda: C'è qualche modo di fare questo tipo di mappatura (che non vedo) o è il modo in cui lo faccio una soluzione ragionevole fino a quando la vera classe Type viene introdotta?

Aggiornamento per Dart 1.0

Esso può essere fatto in questo modo:

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

risposta

4

Aggiornamento: questa costruzione non è attualmente fattibile a Dart

Map<Class<? extends SomeClass>, SomeOtherClass> 

si avrà attendere .type/.class per arrivare e per una soluzione elegante a questo (molti di noi Dartisans sperano che questo arriverà prima piuttosto che dopo). Tuttavia, per il caso più semplice

Map<? extends SomeClass, SomeOtherClass> 

Si può solo fare

Map<SomeClass, SomeOtherClass> aMap; 

come a Dart ogni classe che estende SomeClass è anche andare a essere una valida SomeClass. Per esempio, se si esegue il seguente codice in modalità controllato:

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

allora si otterrà l'errore:

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

nel tuo esempio la chiave nella mappa è un'istanza della classe Test, ma Ho bisogno che la classe sia la chiave, non l'istanza .. oh capisco, il mio codice Java è sbagliato –

+1

ha aggiornato la mia domanda .. –