1

この質問の例は Visual Basic.NET と Java のものですが、このトピックは型推論を実装する他の言語にも適用される可能性があります。

これまで、VB.NET で LINQ を使用する場合にのみ型推論を使用してきました。ただし、以下に示すように、型推論が言語の他の部分で使用できることは承知しています。

Dim i = 1    'i is inferred to be an Integer
Dim s = "Hoi"    's is inferred to be a string

Dim Temperatures(10) as Double

For T In Temperatures      'T is inferred to be a Double
    'Do something
Next

Temperatures(10)型の推論によって、コードの一部を記述するために必要なタイピングの量が減り、基本変数 (上記のような) の型を変更する必要がないため、その型をより迅速に変更できることがわかります。それにアクセスする他のすべての変数 ( などT)。ただし、変数の型がすぐにはわからない可能性があるため、型の明示的な宣言がないため、たとえばコード検査中にコードが読みにくくなる可能性があることを懸念していました。たとえば、上記の For ループだけを見ると、Tが何らかの浮動小数点値であると正しく推測できるかもしれませんが、 の宣言を振り返らなければ、それが単精度か倍精度かを判断することはできませんTemperatures。コードの書き方によっては、Temperaturesはるかに早く宣言することができるため、読者は戻って宣言を見つけてから読み直す必要があります。確かに、優れた IDE を使用している場合、変数名の上にマウス カーソルをすばやく移動すると型が表示されるため、これはそれほど問題ではありません。

また、状況によっては型推論を使用すると、コードを変更しようとしたときにバグが発生する可能性があると思います。AクラスとBがまったく異なることを行うと仮定して、次の (明らかに不自然な) 例を考えてみましょう。

Class A
    Public Sub DoSomething()
    End Sub
End Class

Class B
    Public Sub DoSomething()
    End Sub
End Class

Dim ObjectList(10) As A

For item In ObjectList
    item.DoSomething()
End For

ObjectListfromの型を to に変更AするBと、コードはコンパイルされますが、機能が異なり、コードの他の部分でバグとして現れる可能性があります。

型推論の例をいくつか挙げると、ほとんどの人は、型推論を使用しても可読性や保守性に悪影響を及ぼさないことに同意するだろうと想像できます。たとえば、Java 7 では、以下を使用できます。

ArrayList<String> a = new ArrayList<>();    // The constructor type is inferred from the declaration.

それ以外の

ArrayList<String> a = new ArrayList<String>();

私は、この問題について人々がどのような考えを持っているか、また、型推論をどの程度広範囲に使用すべきかについての推奨事項があるかどうかを知りたいと思っていました。

アムル

4

3 に答える 3

3

個人的には、型が明確で、コードが読みやすくなる場合にのみ、暗黙的な型推論を使用する傾向があります。

var dict = new Dictionary<string, List<TreeNode<int>>>();

よりも読みやすい

Dictionary<string, List<TreeNode<int>>> dict =
    new Dictionary<string, List<TreeNode<int>>>();

まだタイプは明らかです。


ここでは、何が得られるかは明確ではありません。タイプを明示的に指定します。

var something = GetSomeThing();

ここではvar何も単純化しないため、使用しても意味がありません

int i = 0;
double x = 0.0;
string s = "hello";
于 2012-04-15T22:20:47.977 に答える
1

一部はコーディングスタイルの問題だと思います。私は個人的に、選択肢が与えられたより冗長なコードを使用します。(ただし、Java 7 プロジェクトに移行するときは、すべてがまだ 1 行にあるため、おそらく新しい構文を利用するでしょう。)

また、明示的であることで、特定の微妙なバグを回避できると思います。あなたの例を見てください:

For T In Temperatures      'T is inferred to be a Double
    'Do something
Next

が であるDo somethingことに依存する数値メソッドであった場合、単精度に変更すると、アルゴリズムが収束に失敗したり、正しくない値に収束したりする可能性がありました。TDoubleTemperatures

別の言い方をすれば、変数の型を明示することで、場合によっては回避できたはずの些細な保守作業が大量に発生する可能性があると考えることもできます。繰り返しますが、すべてはスタイルの問題だと思います。

于 2012-04-15T21:11:30.200 に答える
-2

Generics の使用は、実行時に処理するのではなく、コンパイル時に型の安全なチェックを保証することです。タイプ セーフを正しく使用している場合は、実行時の例外から解放され、データ取得時にキャスト コードを記述する必要もありません。

Java は jdk 1.7 より前はこの sendax を使用しません

ArrayList<String> a = new ArrayList<>(); 

これは

ArrayList<String> a = new ArrayList(); 

しかし、Javaでは

ArrayList<String> a = new ArrayList(); and
ArrayList<String> a = new ArrayList<String>();

参照変数は文字列である安全な型のコンパイル時間情報を保持するため、両方とも同じと見なされます。つまり、文字列の代わりに何かを追加することはできません。

a.add(new Integer(5));

まだタイプセーフであり、文字列しか挿入できないというエラーが発生します。

だから、あなたが期待していることをすることはできません。

于 2012-04-15T21:00:13.723 に答える