2012-07-09 11 views
5

我移植一些Java代碼來DART和它大量使用這些類型的地圖:通過地圖中的類達特

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

,並在那裏我需要的類它有一個簡單的GET-方法

abstract Type get type(); 

這樣,我可以用我的Type就像我會用實際Type的d稍後切換,我只需要刪除我的解決方法。

我的問題:有沒有做這種映射的飛鏢方式(我沒有看到),還是我採用合理的解決方法,直到真正的Type類被引入?

更新飛鏢1.0

這是可以做到這樣:

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

回答

4

更新:這種結構是目前不在飛鏢

Map<Class<? extends SomeClass>, SomeOtherClass> 

,你將有可行的等待.type/.class到達e爲此提供了一個優雅的解決方案(我們很多Dartisans都希望這個問題能夠早日到達而不是晚些時候)。然而,對於簡單的情況

Map<? extends SomeClass, SomeOtherClass> 

你可以做

Map<SomeClass, SomeOtherClass> aMap; 

在達特延伸SomeClass的任何類也將是一個有效的SomeClass的。例如,如果你在檢查模式下運行下面的代碼:

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

在地圖的關鍵是類測試的實例,但我需要類是關鍵,而不是實例..哦,我明白了,我的Java代碼是錯誤的 – 2012-07-09 21:42:11

+1

更新了我的問題.. – 2012-07-09 21:44:14