-5

Dart Editor バージョン 1.2.0.release (STABLE)。Dart SDK バージョン 1.2.0。

このソース コードは実行時例外を生成します。

void main() {
  test(new Base());
}

void test(Child child) {
}

class Base {
}

class Child extends Base {
}

アナライザーがこのようなものを生成すると仮定しました。

The argument type 'Base' cannot be assigned to the parameter type 'Child'

ただし、実行時にこの例外が発生したときにのみ、このエラーを検出できます (事後)。

Unhandled exception:
type 'Base' is not a subtype of type 'Child' of 'child'.
4

2 に答える 2

6

アナライザーは、こちらの言語仕様に従っています。

引数式の静的な型が関数の型のパラメーターに代入できない場合にのみ警告します。

Dart では、一方の型が他方のサブタイプである場合、ある型の式を別の型の変数に割り当てることができます。

これは安全な型チェックではありません。考えられるすべてのエラーが検出されるわけではありません。一方、次のようないくつかの正しい使用も禁止しません。

Base foo = new Child();
void action(Child c) { ... }
action(foo);  // Perfectly correct code at runtime.

他の言語には安全な割り当てチェックがありますが、一部の正しいプログラムも妨げられます。次に、プログラムが安全であることを知っていることをコンパイラーに伝えるために、(安全でない/実行時にチェックされた) キャスト演算子を追加する必要があります。これは、Dart が寛容であり、ほとんどのキャストを回避することを選択したトレードオフです。

于 2014-03-02T20:05:09.957 に答える
1

礼儀正しく、先入観を持たずに質問に答えるようにしましょう。

私はあなたが期待したことを理解していると思います。ここで、エラーの意味についての私の角度:

  1. Base 型の引数を使用してメソッドを呼び出しています
  2. メソッドは Child 型の引数を期待しています
  3. Child は Base と等しくなく、そのサブタイプでもありません (実際、Base のサブタイプは Child です)。

期待されるタイプ(またはそのサブタイプ - 特殊化)のオブジェクトを提供することだけが意味があるため、期待どおりに機能しています。


アップデート:

あなたの質問をもう一度読んだ後、エディターがタイプの問題を見つけていないことを指摘していることに気付きました。これは、Dart プログラムが動的であるため、実行前に特定のチェックが行われないためだと思います。

それが役に立てば幸い ;-)

于 2014-03-02T14:25:25.230 に答える