0

私はJavaジェネリックの研究を始めました。そして、私はジェネリック構文とその意味についていくつかの誤解を持っています。私の質問が些細なことだと思われる場合は、理解して扱ってください。

  1. あなたは書ける:

    public class MyClass<SomeClass> {}
    
  2. そしてあなたは書くことができます:

    public class MyClass<C extends SomeClass> {} 
    
  3. そしてあなたはまた書くことができます:

    public class MyClass<? extends SomeClass> {} 
    

これらの場合の違いは何ですか?

  1. 最初のケースは私には絶対に明らかです。SomeClassインスタンスとそのサブクラスのインスタンスをMyClassのクラスのパラメーターとして使用できます。
  2. この場合、MyClassのサブクラスのインスタンスのみを使用できると思います
  3. 同じ:MyClassのサブクラスのインスタンスのみをMyClassのクラスのパラメーターとして使用します。

私の推測は正しいですか?特に、2番目と3番目のケースの使用の違いは何ですか?

説明ありがとうございます!

4

1 に答える 1

1

違いは?、ジェネリッククラス宣言で使用できないことです

public class MyClass<? extends SomeClass> {} // this isn't valid  

上記の宣言により、コンパイラ エラーが発生します。

ドキュメントから:

ジェネリック クラスは、次の形式で定義されます。

クラス名 { /* ... */ } 山かっこ (<>) で区切られた型パラメーター セクションは、クラス名の後に続きます。型パラメーター (型変数とも呼ばれます) T1、T2、...、および Tn を指定します。

public class MyClass<C extends SomeClass> {} 

この宣言Cには、タイプ SomeClass またはそのサブクラスのいずれかの型引数があります。

例 :

Class SomeOtherClass extends SomeClass {
}

MyClass clazz = new MyClass<SomeOtherClass>();
MyClass clazz = new MyClass<SomeClass>(); 
于 2012-12-27T14:00:07.033 に答える