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,稍后切换我只需要删除我的解决方法。

我的问题:在引入真正的课程之前,是否有一些做这种映射的飞镖方式(我没有看到)或者我这样做的方式是一种合理的解决方法Type

Dart 1.0 更新

可以这样做:

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

1 回答 1

6

更新:这种结构目前在 Dart 中是不可行的

Map<Class<? extends SomeClass>, SomeOtherClass>

您将不得不等待.type/.class到达,以便找到一个优雅的解决方案(我们很多 Dartisans 都希望它能够早日到达)。但是对于更简单的情况

Map<? extends SomeClass, SomeOtherClass>

你可以做

 Map<SomeClass, SomeOtherClass> aMap;

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

然后你会得到错误:

type 'NotATest' is not a subtype of type 'Test' of 'key'.
于 2012-07-09T21:26:30.387 回答