とどう違うのジェネリック医薬品のC#、Javaとは---テンプレートのC++?[定休日]

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

質問

今Javaおよびジェネリック医薬品と比較的新しい。また読書をJavaのメソッドを誤った決定、ということで。当期純により、実装など。など。

では、どの違いはC++、C#、Java、ジェネリック医薬品?プ/連結実績の?

役に立ちましたか?

解決

ただ私の音声の雑音や刺しでも明確

C#のジェネリック医薬品きを宣言するようなものです。

List<Person> foo = new List<Person>();

そしてコンパイラを防止できます入れてからでないものは Person を一覧です。
裏のC#コンパイラですけ List<Person> へきます。純dllファイルが実行時には、JITコンパイラとビルドの新しいコード、また特殊なリストクラスだけを含む人々のようなもの ListOfPerson.

ここでは早いですね。ありません鋳物又はその他のものでdllを含む情報をこのリスト Person, その他のコードに見えるものその後を反映え、それに含まれ Person オブジェクト(いたしますので、あら行頭に付けた。

の下振れであるC#1.0や1.1コードする前に追加ジェネリック医薬品)付いているのかなんてわからんこれらの新しい List<something>, ですから、手動で変換えるplain old List 互換です。これはそんなに大きくないのが問題であり、C#2.0のバイナリコードは下位互換性をもつ。にこれがあれば更新していなかったのC#1.0/1.1のコードC#2.0

Javaジェネリック医薬品きを宣言するようなものです。

ArrayList<Person> foo = new ArrayList<Person>();

表面の見た目には同じで、まうのです。のコンパイラーでも防止できます入れてからでないものは Person を一覧です。

その違いはどうなるコンプライアンス-とは異なり、C#、Javaなく、特別 ListOfPerson で使用して、古 ArrayList しているJava.きものの配列は、通常の Person p = (Person)foo.get(1); 鋳造-ダンスは変わりました。のコンパイラを大幅に短縮できますのキープレスがヒット/鋳造が生じたときと同じように常にしました。
うち"タイプの消去"こういうのです。のコンパイラに挿入しますかぶりまし'を消すのがこのリスト PersonObject

の利益をこのアプローチである旧コードがわからないジェネリック医薬品となります。まだまだ対応をあらかじ ArrayList いままでも、そしてこれからもこのことが大切なのではないかとのドキュメンテーションシステムみたいなもので支援コードの作成Javaを利用して5とジェネリック医薬品、有効とされる成分が多く含まれて旧1.4以前のJVMの、microsoftえないこととなった邪魔です。

下振れの速度にヒットし冒頭に触れたとおり、こうしたものではありません ListOfPerson 擬似クラスは何でもいいます。クラスファイル、コードに見えるものその後(反射場合、または引き出ることができなければ、この他収集して換算 Object やちでない方はあると思うので、このリストだけを含む Person だけでなく、他の配列一覧です。

C++テンプレートできる宣言のようなこと

std::list<Person>* foo = new std::list<Person>();

のようになり、C#、Javaジェネリック医薬品でんお返事ありがとうございます。するべきなのが、裏で異なるとも起きています。

では最も共通とC#のジェネリック医薬品になるということではまったらしい特別 pseudo-classes な手のタイプ情報のようにjavaは、その全ての釜。

両方のC#、Java出力は仮想マシン書き込む場合は一部のコードする Person クラスでは、両方の場合についての情報は、 Person クラスに入ります。dllいます。クラスファイルのJVM/CLRいものです。

C++生原x86バイナリコードです。すべては ない オブジェクトがあるわけではない元の仮想マシンが必要な時に必要な知 Person クラスです。ありませんボクシングやunboxing、機能な所属クラス、または確かにあります。

そのためのC++コンパイラの場所に制限がないのでよくお使いいただくためにテンプレート-基本的に任意のコードが書くのは手動で取得できるテンプレートを書きます。
目の前にある、ことりと触れ合えるもの:

クライアントまで、フルのC#、Java、ジェネリック医薬品システムのニーズを知るのはどのような方法がありまクラスでこの仮想マシン。のみくい時にはもってこいですからハード-コーディングの実際のクラスはインタフェース例えば:

string addNames<T>( T first, T second ) { return first.Name() + second.Name(); }

このコードなコンパイルのC#またはJavaでないことを知らないタイプ T 実際に提供することにな名().いえい-クライアントまで、フルのC#のようになります:

interface IHasName{ string Name(); };
string addNames<T>( T first, T second ) where T : IHasName { .... }

しいかどうかを確認するためにも通過するaddNamesの実施をIHasNameスです。Javaの書式が異なる<T extends IHasName>だから同じです。

のクラシック'の場合はこの問題のような関数を書くのはこの

string addNames<T>( T first, T second ) { return first + second; }

できない実際に書くこのコードがないための方法を宣言するインターフェースの + 方法です。おに失敗します。

C++からなのです。コンパイラのない介護のお渡しについての種類をVMの場合もごオブジェクト。Name()機能でコンパイル。決めなければならないのではしないシンプルです。

います:-)

他のヒント

C++の起用の"ジェネリック医薬品"用しています。代わりに、"テンプレート"を使用し、精度が高くなります。テンプレートの解決につながる 技術 めの汎用的なデザイン。

C++テンプレートとは大きく違う両方のC#、Javaの実施のための二つの大きな原因です。第一の理由は、C++テンプレートだけではなくをコンパイル時の型引数がコンパイル時の定数の値引数:テンプレートできる整数としても機能します。することができるいくつかの非常にファンキーなものをコンパイル時の例計算

template <unsigned int N>
struct product {
    static unsigned int const VALUE = N * product<N - 1>::VALUE;
};

template <>
struct product<1> {
    static unsigned int const VALUE = 1;
};

// Usage:
unsigned int const p5 = product<5>::VALUE;

このコードにも使用してその他の特徴のC++テンプレート、すなわちテンプレート専門性を高めます。このコードを定義一クラス上のテンプレート product その一つの値を引数に使います。でいても明らかにしています。専門用するテンプレートに使用されるものの引数で評価で1となります。また定義する繰り返テンプレート上を規定します。このが発見した アAlexandrescu.

テンプレートの専門は重要なC++できるようにするために、構造の違いデータ構造です。テンプレート全体としての統一、インターフェースです。しかし、こうしていることが望ましいが、すべての種類できないものの実装です。C++テンプレートこの。ここでも同じるOOPことの界面及び実施のをオーバーの仮想。

C++テンプレートは不可欠で、そのアルゴリズムのプロパラダイム例えば、ほとんどすべてのアルゴリズムの容器として定義した機能をコンテナタイプとしてのテンプレート種別これに対して一様にうことになるなC++な容器ではなく、 範囲 で定義されている二つの反復子を指摘し、首の後ろの容器です。このように、全てのコンテンツ囲の反復子:を開始 <=要素 < ます。

を反復子の代わりにコンテナ用できるようにするために、操作部品の容器ではなくようにする。

別の特徴はC++の可能性 一部の専門 クラステンプレート。このと言えば、関心があるパターンマッチングに引数をウその他の機能の言語である。例えば、考えてみましょうクラスを格納する要素

template <typename T>
class Store { … }; // (1)

この作品の任意の要素タイプです。もしようとするような接し方ができる店舗へのポインターよりeffciently他の種類を特リックを達成しています。ることができまによる 部分的に 専門のためのすべてのポインタの種類

template <typename T>
class Store<T*> { … }; // (2)

現在私たちがインスタンスのコンテナのテンプレート一式、適切な定義を使用してい

Store<int> x; // Uses (1)
Store<int*> y; // Uses (2)
Store<string**> z; // Uses (2), with T = string*.

Anders Hejlsberg自身に記載の違いはこちら"ジェネリック医薬品のC#、Java、C++".

が既に多くの応答 の違いは、長い波長の場合若干異なる視点を追加します なぜ.

既にご説明したように、主な違いは タ消去, (このJavaコンパイラソウの種類やかに発生するbytecode.しかし、ここでの問いはだいた。然マーサの特別な心にも感動!たいのですか?

ちなみに、代替?ない場合は実行ジェネリック医薬品の言語が を実行します。答えとしては:の仮想マシン。ブレーク後退に対応しています。

タ消去、他方で、ミキシングが可能一般のお客様以外の一般的な図書館"言い換えればコードするためのJava5で展開するJava1.4.

Microsoftした休みの下位互換性のためのジェネリック医薬品. ことになる いかがでしょうか。純ジェネリック医薬品は"より良いもの"よりJavaジェネリック医薬品.

もちろん、太陽ない愚か者又はcowards.その理由は何なのか"chickened out"が、明日出発予定のため、Javaの著しい高齢量的拡大を続けております。純が導入されたジェネリック医薬品.がうるさかったの導入とほぼ同時に両方を楽しめます。) 破断の下位互換性がて大きな痛みました。

入れてあることが少なくない。Javaでは、ジェネリック医薬品の一部を 言語 るうえ申請書を提出してくださ のみ Javaなどの言語)までお問い合わせください。当期純にとっては 仮想マシン (といって適用 すべての 言語だけでなく、C#とVisual Basic.NET).

と比較することです。純うLINQ、ラムダ仕様の表現、局所変数の型推論、匿名の種類および表現の木:これらはすべての 言語 が特徴です。それは微妙な違いVB.NET C#:が特徴のVMには、同 すべての 言語.そのCLRは変わりません:でみ重ねの上に成り立っています。純3.5SP1でした。純2.0にアクセスしてください。できるコンパイルのC#プログラムを使用するLINQをしました。純3.5コンパイラが実行します。純2.0では、使わない。純3.5。う ない 作品のジェネリック。純1.1で 作JavaおよびJava1.4.

続き前の投稿.

テンプレートの主な理由はC++に失敗したのでabysmallyで行頭に付けにかかわらず、IDEを使用します。でのテンプレートを専門にIDEができるものではないと思指定された会員が存在します。発生していると考えること

template <typename T>
struct X {
    void foo() { }
};

template <>
struct X<int> { };

typedef int my_int_type;

X<my_int_type> a;
a.|

現在のカーソルの指定された位置で気難しいのIDEいる場合、会員は a ます。その他の言語の構文解析する簡単なものためのC++、といった評価が必要であります。

れが悪くなることがあります。どの場合 my_int_type が定義された内部クラステンプレートでも見ることができますか?現在そのように別の型引数です。ところで、ここでもコンパイラでコンパイルに失敗します。

template <typename T>
struct Y {
    typedef T my_type;
};

X<Y<int>::my_type> b;

後のビットの考え方は、プログラマはここのコードと同じですが、上記の Y<int>::my_type を解決する int, ため、 b すべきと同じタイプ a, ですよね?

間違っています。のコンパイラを解決することで解決されているとは思いませんが、実は知ら Y<int>::my_type 関する詳細を策定したものです。そのため、知らないがこのタイプです。できるよう、会員機能はます。これが曖昧さがないので、コンパイラに失敗します。しかで明示的にこの参照型名:

X<typename Y<int>::my_type> b;

現在、コードの統.どの観念を生じることが考えら以下のコード:

Y<int>::my_type(123);

このコードは完全に有効で語C++を実行する関数の呼び出 Y<int>::my_type.ただし、 my_type 機能ではありませんではなく、プロトタイプとし、本書がまだ有効であるのは、特別キャストの機能-スタイルキャスト)であることが多いのコンストラクタの呼び出し.のコンパイラができないことを意味しておりまdisambiguateます。

両方のJavaとC#のジェネリック医薬品の導入後の最初の言語です。しかし、違いはあるものの、どのようにコア図書館がジェネリック医薬品紹介されました。 C#'sのジェネリック医薬品だけでなくコンパイラの魔法 いることはできなかった generify 既存の図書館の授業を壊すことなく、逆に対応しています。

たとえば、Java、既存の Collections Framework完全にgenericised. Javaでなくても汎用や非アクコレクションにつ。 一方でこれはクの使用を希望する場合は、事前にコレクションのC#であり非常に少ない理由の一つは、非ク、レガシーの授業は、clutteringの風景。

他の大きな違いは、列挙クラスJava-C#. JavaでのEnum型はこのやや複雑なをみ定義:

//  java.lang.Enum Definition in Java
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {

(Angelikaランゲルの非常に明確な 説明正理由 こもそうです。基本的には、Javaできるタイプの安全なアクセスから文字列を列挙型値:

//  Parsing String to Enum in Java
Colour colour = Colour.valueOf("RED");

と比較することによC#'sバージョン:

//  Parsing String to Enum in C#
Colour colour = (Colour)Enum.Parse(typeof(Colour), "RED");

として列挙型が存在していたクライアントまで、フルのC#前のジェネリック医薬品を紹介された言語の定義が変わらないが破損することなく、既存のコードです。そのようなコレクション、itをコア図書館もこの遺産の状態です。

11月下旬、私はこの問いかけたJavaワイルドカード。

これは文法の特徴Java.い方法:

public <T> void Foo(Collection<T> thing)

やかんのシリコーンコーティング処理の方法。いを宣言し、名をTとして使用しますので、なぜできないと思ってい名前です。代わりに記述することができ:

public void Foo(Collection<?> thing)

のマークは言うまでもなく両者のコンパイラを振ります宣言された通常の名前付きの型パラメータだけを通知する必要が回るスポットです。

あができるワイルドカードできませんもんが名前付きの型パラメータはどこでも行うC++とC#).

Wikipediaには書きアップとの比較も Java/C#のジェネリック医薬品Javaジェネリック医薬品/C++ テンプレート。の メインの記事がジェネリック医薬品 のように見えるビットのごちゃごちゃになっていくつかの良い情報です。

最大の苦情が消去.その中で、ジェネリック医薬品は強制力がない。 こちらのリンクへ日docsの.

ジェネリック医薬品によって実施されましたタイプ 削除:汎用タイプ情報 現在のコンパイル時にのみ後 では消去をコンパイラです。

C++テンプレート感によりC#、Javaとして評価でコンパイル時間および専門性を高めます。このテンプレートメタプログラミングのC++コンパイラに相当するコンピュータ(中には、"全国短観"と"支店短観"のときの計算があるので、そちらもぜひ応用とチューリングになります。

Javaでは、ジェネリック医薬品はコンパイラのレベルだけです:

a = new ArrayList<String>()
a.getClass() => ArrayList

ご注意の型'a'が配列リストではなく、リストの文字列です。でインターネットブラウザのリストのバナナが等しい()リストの唆した。

する訳ではありません。

のように見え、非常に興味深い提案、いいジェネリック医薬品の精製と破壊の下位互換性:

現在、ジェネリック医薬品の実施 利用停止-消去、 汎用タイプの情報ではない ご利用ランタイム時において、ある一部 のようなコードのハードへの書き出します。ジェネリック医薬品 実施されたこのように支援 との下位互換性高齢 非一般のコードです。Reifiedジェネリック医薬品 ということは、汎用タイプ 情報のランタイム時において、 という休憩レガシノリ コードです。しかし、ウGafterは についての議論種類reifiableみ 指定した場合、は、必ず記入してください 後方に対応しています。

アレックス-ミラーの条約Java7の提案

※いるのに十分なポイントコメントので、お気軽に移動することへのコメントの適切な答えです。

黒い、まいとなった.純行trueのジェネリック医薬品を壊すことなく、下位互換性として明示的に努力する。いをしていて非等のクラスを提供します。.純1.0コードジェネリック医薬品に使用されます。純2.0にアクセスしてください。両方の単一般のリストもそのままご利用いただけます。Net framework2.0にもまで4.0、何が後方互換性の理由です。そのためのコードも用いる汎用のArrayListも、同じものを使用ArrayListクしています。後にコードの互換性は維持されて1.0今まで...うものです。net4.0、オプション使用の他のジェネリック医薬品のクラスから1.0BCLご選択ください。

とは思わない、新しいパースペクティブのための休憩の後方互換性の支援がtrueのジェネリック医薬品.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top