2013-06-05 5 views
5

ジェネリッククラスについてお聞きしたいと思います。ジェネリッククラスから2つのオブジェクトインスタンスを作成するとどうなりますか?すべての静的メンバーを共有していますか、または両方とも独自の静的メンバーを持っていますか?ジェネリッククラスは静的メンバーを共有しますか?

ですから、例えば:

public A<?>(){ 
    public static Integer member = 0; 
} 

A<Integer> integer = new A<Integer>(); 
A<String> string = new A<String>(); 

くださいIntegerString両方がmemberの背後に同じ参照を持っていますか?

+2

あなたの質問は有効ですが、投稿したコードが悪いです:これは有効なコンストラクタでもクラス宣言でもありません。あなたの質問に対する答えは:はい、すべての静的メンバーを共有します。また、自分で質問に答えることもできます: 'System.out.println(integer.member == string.member);' System.out.println(A.member == A.member);と同じです。静的であるため) – jlordo

+0

テストすることは難しくありません。 – Dukeling

+0

メンバー自体が一般的な場合はどうなりますか? 'public class MyClassと似ています {public static T member; } '?? –

答えて

10
public class A<T>{ 
    public static Integer member = 0; 

    public static void main(String[] args) 
    { 
     A<Integer> integer = new A<Integer>(); 
     A<String> string = new A<String>(); 

     integer.member++; 
     System.out.println(string.member); 
    } 
} 

出力

1 

ので、はい2つのインスタンスが同じmember変数を共有しています。

+2

+1質問の良い例です。また、 'integer.member ++;'が悪いスタイルであり、stylecheckersはこのようなコードを避けることに注目してください。 'staticメンバーは常に静的な方法でアクセスする必要があります。つまり、' A.member ++; '。 – jlordo

+0

疑問に思っているときにそれをテストしてください! :) +1 – Pragmateek

0

はい、変数を共有します。静的クラス変数に関する規則はGenericsの使用に基づいて変更されません。静的クラス変数は、すべてのインスタンスで共有されます。

+1

これは当然のことではありません。 C++では、 'A 'と 'A 'は異なる静的データメンバーを持つ異なるクラスになります。 –

+0

@NicolaMusatti:これは 'java'タグの下の質問です.... – jlordo

+0

確かに。しかし、JavaジェネリックスはC++のテンプレートに触発されており、その違いを指摘することが重要だと思います。 –

0

実行時にA<Integer>A<String>が異なるクラスではないため、それらのすべてが静的属性を共有します。

0

ジェネリックはコンパイル目的のものだと考える必要があります。実行時にA<Integer>A<String>の間に違いはありません。すべてのインスタンスはAです。したがって、静的メンバーは、使用しているタイプに関係なく、作成できるインスタンスに共通です。

3

いい質問が、anwserがある:何あなたは非常に単純な理由のためにすることはできません。一度コンパイル<整数>または<文字列>のようなものだけであるため、下位互換性の理由のJava用、ありませんジェネリック型消去を使用します。

C#のような他の言語では、C#がジェネリックで始めて作成されたため、期待通りに動作します。

+0

C#を挙げてくれてありがとう。私の考えの元はC#の例です。 – Quirin

+0

私は似たような状況にあります。過去10年のJavaを使用して戻っても難しいですが、ギャップを埋めると確信しています。 :) – Pragmateek

2

パラメータ化された型(A<Integer>など)を表すクラスリテラル(A<Integer>.classまたはClassインスタンス)はありません。生バージョンA(つまりA.class)の1つだけ常に存在し、それはすべての静的メンバーが属するものです。

A<Integer>.memberのようなことはしません。それは常に生のバージョンA.member(これはすべてのインスタンスで共有される)です。

こちらの記事はIs there one instances of a static field per instantiation of a generic type?です。

関連する問題