【问题标题】:Map by Class in Dart在 Dart 中按类映射
【发布时间】:2013-12-07 16:57:20
【问题描述】:

我正在将一些 Java 代码移植到 Dart,它大量使用这些类型的映射:

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

目前这在 dart 中似乎是不可能的。我知道有一个引入第一级类型的提议: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;

【问题讨论】:

    标签: dart


    【解决方案1】:

    更新:这种结构目前在 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'.
    

    【讨论】:

    • 在您的示例中,地图中的键是 Test 类的实例,但我需要类作为键,而不是实例。哦,我明白了,我的 Java 代码是错误的跨度>
    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2022-01-16
    • 2020-07-14
    • 1970-01-01
    • 2018-10-01
    • 2023-03-15
    相关资源
    最近更新 更多