2009-03-01 4 views
0

「キャスティング」を除いて、JavaやC++などの静的型言語で変数の型を変更する方法は他にありますか?静的な型指定は、型を変更する場合に変数をキャストする必要があることを意味しますか?

私は動的なタイピングと静的なタイピングの間の主な違いを実践的に理解し、非常に学術的な定義を見つけようとしています。私は自分のコードがどのように見えるかという点で何を意味するのだろうかと思っています。

+0

キャストは変数の型を変更しません。キャストの結果は、どこにでも暗黙的に格納されていない新しい式です。 – recursive

答えて

11

強いタイプと弱いタイプの混在と混同しない静的なタイプと動的なタイプが混同されないように注意してください。

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

これら二つの正反対を自由に組み合わせることができます

  • Javaは静的であると強くCは静的および弱く型付けされ
  • 型付け
  • Rubyは動的であると強く
  • を入力(ポインタ算術演算を!)
  • JavaScriptは動的で弱く型付けされています

一般的に静的な型定義とは、動的に型定義された言語のランタイムエラーである多くのエラーがコンパイラによってキャッチされることを意味しますが、多くの場合、型に関する不安を払うために多くの時間を費やしていますアヒルタイピング)。

強い型指定は、型間の変換は、キャストまたは変換メソッド(たとえば、文字列を整数に解析するなど)を使用して明示的に指定する必要があることを意味します。これは、より多くの型付け作業を意味しますが、システムを暗黙の暗黙の変換を行うと、弱い型指定によって混乱が生じることがあります。ライン。

+0

ありがとう。 –

4

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

スタティックタイピング:変数には、コンパイルタイプで割り当てられた1つのタイプがあり、変更されません。

動的タイピング:実行時に変数の型が変更される可能性があります。 JavaScriptの場合:

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

キャストしないでタイプを変更しますか? –

+1

@マーク、VALUEのタイプは変更できますが、VARIABLEは変更できません。 int i = 42; //フロートに変更することはできません。しかし、i(42)の値は可能である。私の例を見てください。 – strager

+1

変数の型ではありません。値/式の型を変更することができます –

1

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

0

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

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++でユニオンを使用すると、何らかの動的な型定義を行うことができます。

1

私のコードがどのようになっているかという点ではどういう意味でしょうか。

タイプシステムは、必ずしもどのようなコードにどのような影響を与えるものではありません。静的型付け、型推論、暗黙的変換(Scalaなど)の言語は、動的に型定義された言語によく似ています。参照:What To Know Before Debating Type Systems

0

彼は定型的な言語とダイナミクスのJavaScriptを見てみましょう。 Javaでは、オブジェクトの場合、変数はオブジェクトへの参照です。オブジェクトには実行時型があり、参照には型があります。参照のタイプは、ランタイムオブジェクトのタイプまたはその祖先のタイプでなければなりません。これが多形性の仕組みです。あなたは参照型の階層を上に上がるようにキャストしなければならないが、下にはならない。コンパイラは、これらの条件が満たされていることを確認します。 JavaScriptのような言語では、あなたの変数はまさにその変数です。あなたはそれがあなたが望むどんなオブジェクトでも指し示すことができ、あなたがチェックするまでそれのタイプを知らない。

変換には、変換を行い、同じ相対値を持つ新しい型のオブジェクトを生成するために、toIntegerやtoFloatのような多くのメソッドがあります。 JavaScriptでは変換方法もありますが、新しいオブジェクトも生成されます。

+0

したがって、JavaのtoFloatは既存のオブジェクトを変更しません。私はあなたがx = "abc"とx = "100"と言うことができるRubyを見ています.Javascriptは新しいオブジェクトを生成すると言いましたが、Rubyは既存のオブジェクトを新しい型に変更すると思いました。または私は間違っていますか? –

0

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

たとえば、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