5

一部のJavaコードをDartに移植していますが、次の種類のマップを多用しています。

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

現時点では、これはダーツでは不可能のようです。私は、第1レベルのタイプを導入する提案があることを認識しています: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クラスが導入されるまでそれを行う方法は合理的な回避策ですか?

Dart1.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 に答える