我正在将一些Java代码移植到Dart,它大量使用这些类型的地图:
Map<Class<? extends SomeClass>, SomeOtherClass> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
目前这在飞镖中似乎是不可能的.我知道有一个建议引入第一级类型: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
}
Run Code Online (Sandbox Code Playgroud)
因此,在此提案实施之前,我创建了以下类:
class Type {
final String classname;
const Type(this.classname);
String descriptor() => classname;
}
Run Code Online (Sandbox Code Playgroud)
我需要它的类有一个简单的get方法
abstract Type get type();
Run Code Online (Sandbox Code Playgroud)
这样我可以使用我Type
就像我会使用真实Type
并稍后切换我只需要删除我的解决方法.
我的问题:是否有一些方法可以进行这种映射(我没有看到)或者我是否采用合理的解决方法直到Type
引入真正的类?
Dart 1.0的更新
它可以这样做:
var map = new Map<Type, SomeOtherClass>();
// either
map[SomeOtherClass] = new SomeOtherClass();
// or
var instance = new SomeOtherClass();
map[instance.runtimeType] = instance;
Run Code Online (Sandbox Code Playgroud)
更新:此构造目前在Dart中不可用
Map<Class<? extends SomeClass>, SomeOtherClass>
Run Code Online (Sandbox Code Playgroud)
您将不得不等待.type / .class才能找到一个优雅的解决方案(我们很多人都希望这会早日实现)。但是对于更简单的情况
Map<? extends SomeClass, SomeOtherClass>
Run Code Online (Sandbox Code Playgroud)
你可以做
Map<SomeClass, SomeOtherClass> aMap;
Run Code Online (Sandbox Code Playgroud)
与Dart中一样,任何扩展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;
}
Run Code Online (Sandbox Code Playgroud)
那么你会得到错误:
type 'NotATest' is not a subtype of type 'Test' of 'key'.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
866 次 |
最近记录: |