静的型付けとは、型を変更したい場合に変数をキャストする必要があるということですか?

StackOverflow https://stackoverflow.com/questions/600126

質問

「キャスト」以外の、JavaやC ++などの静的に型付けされた言語で変数の型を変更する他の方法はありますか?

私は、動的タイピングと静的タイピングの実際の用語の主な違いを理解し、非常に学術的な定義を見つけようとしています。私は自分のコードがどのように見えるかという観点からそれが何を意味するのか疑問に思っています。

役に立ちましたか?

解決

静的タイピングと動的タイピングを、強力なタイピングと弱いタイピングと混同しないようにしてください。

  • 静的型付け:各変数、メソッドパラメータ、戻り値の型などには、コンパイル時に既知の型が宣言または推論されています。
  • 動的型付け:型は無視されます/コンパイル時に存在しません
  • 厳密な型指定:実行時の各オブジェクトには特定の型があり、その型に対して定義されている操作のみを実行できます。
  • 弱い型付け:ランタイムオブジェクトに明示的な型がないか、システムが必要に応じて型を自動的に変換しようとします。

これら2つの反対は自由に組み合わせることができます:

  • Javaは静的かつ強く型付けされています
  • Cは静的かつ弱く型付けされています(ポインター演算!)
  • Rubyは動的かつ強く型付けされています
  • JavaScriptは動的かつ弱く型付けされます

通常、静的型付けは、動的型付け言語のランタイムエラーであるコンパイラによって多くのエラーがキャッチされることを意味しますが、多くの場合、不必要に型の心配に多くの時間を費やすことも意味します(インターフェイスを参照) vs.ダックタイピング)。

厳密な型指定とは、キャストまたは変換メソッド(文字列を整数に解析するなど)を使用して、型間の変換を明示的に行う必要があることを意味します。これはより多くのタイピング作業を意味しますが、物事を制御し続けるという利点がありますが、弱いタイピングはシステムが不明瞭な暗黙の変換を行うときに混乱を引き起こし、混乱した10のメソッド呼び出しを引き起こす完全に間違った変数値を残します行。

他のヒント

C ++ / Javaでは、変数の型を変更できません。

静的型付け:変数には、コンパイルタイプで1つの型が割り当てられ、変更されません。

動的タイピング:変数のタイプは、実行中に変更できます。 JavaScriptで:

js> x="5" <-- String
5
js> x=x*5 <-- Int
25

主な違いは、動的に型付けされた言語では、実行時にそのメソッドが存在するかどうかを使用するまでわからないことです。静的に型付けされた言語では、コンパイル時にチェックが行われ、メソッドが存在しない場合はコンパイルが失敗します。

  

コードがどのように見えるかという点で、それが何を意味するのか疑問に思っています。

型システムは、コードの外観に必ずしも影響を与えません。静的型付け、型推論、および暗黙的な変換(たとえばScalaなど)を備えた言語は、動的型付け言語によく似ています。参照:型システムについて議論する前に知っておくべきこと

明示的にキャストする必要はありません 。多くの場合、暗黙的なキャストが機能します。

例:

int i = 42;
float f = i; // f ~= 42.0
int b = f;   // i == 42

class Base {
};

class Subclass : public Base {
};

Subclass *subclass = new Subclass();
Base *base = subclass;  // Legal

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass.  Performs type checking.  If base isn't a Subclass, NULL is returned instead.  (This is type-safe explicit casting.)

ただし、変数のタイプを変更することはできません。ただし、C ++で共用体を使用して、ある種の動的型付けを実現できます。

Javaを静的に型付けされた言語で、JavaScriptを動的に調べます。 Javaでは、オブジェクトの場合、変数はオブジェクトへの参照です。オブジェクトにはランタイム型があり、参照には型があります。参照のタイプは、ランタイムオブジェクトまたはその祖先のいずれかのタイプである必要があります。これがポリモーフィズムの仕組みです。参照タイプの階層を上に移動するにはキャストする必要がありますが、下に移動する必要はありません。コンパイラは、これらの条件が満たされていることを確認します。 JavaScriptのような言語では、変数は単なる変数です。目的のオブジェクトを指すことができ、チェックするまでそのタイプがわかりません。

ただし、変換には、JavaのtoIntegerやtoFloatなど、変換を実行して同じ相対値を持つ新しいタイプのオブジェクトを生成するメソッドがたくさんあります。 JavaScriptには変換メソッドもありますが、新しいオブジェクトも生成されます。

静的に型付けされた言語を使用しているかどうかにかかわらず、コードは実際にはそれほど大きく変わらないはずです。動的に型付けされた言語で変数のデータ型を変更できるからといって、そうすることをお勧めするわけではありません。

たとえば、VBScriptでは、ハンガリー表記法が変数の優先データ型を指定するためによく使用されます。そうすれば、コードにタイプが混在している場合に簡単に見つけることができます。 (これはハンガリーの表記法の元々の使用法ではありませんでしたが、かなり便利です。)

同じデータ型を維持することにより、コードが実際に何をしているのかを伝えるのが難しい状況や、コードが単に正しく機能しない状況を回避できます。例:

Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
  id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings

ハンガリー表記を使用すると、次のようなタイプが混在しているコードを見つけることができます。

lngId = Request.QueryString("id") ' putting a string in a numeric variable

strId = 42 ' putting a number in a string variable
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top