public class B extends C <A> {
}
これは何を意味するのでしょうか?その C は A を拡張する必要がありますか? B が C を拡張すると言う代わりに、どのような追加の制限を課すのでしょうか?
public class B extends C <A> {
}
これは何を意味するのでしょうか?その C は A を拡張する必要がありますか? B が C を拡張すると言う代わりに、どのような追加の制限を課すのでしょうか?
タイプ A でパラメータ化された、クラス C から継承するクラス B を定義しています。A は、クラスまたはインターフェイスでなければなりません。
例えば
class MyStringList extends ArrayList<String>
要素のみを含むMyString
IS ANを意味します。このクラスは、たとえば、リスト内のすべての連結を返すメソッドを定義できます。ArrayList
String
concatenate()
Strings
List<String>
この継承により、インスタンスを変数に割り当てることができます。
List<String> strings = new MyStringList();
List
ただし、他のパラメーターを持つ型変数に割り当てることはできません。
List<Object> objects = new MyStringList(); // does not compile
C<A>
C
は拡張しているという意味ではなく、型パラメーターとしてA
持つことができるという意味です。A
これは、Java のインターフェイスComparable<T>
と非常によく似ています。Comparator<T>
次の例を検討してください
public class NameSort implements Comparator<Employee> {
public int compare(Employee one, Employee another){
return (int)(one.getName() - another.getName());
}
}
Comparator が Employee オブジェクトを使用して、その名前を使用して並べ替えていることを意味します。
別の例を挙げることもできます
List<String> list = new ArrayList<String>();
この行は、オブジェクトをパラメーターとしてList
使用していることを意味しますString
クラスB
はC
.
C
でB
パラメータ化されますA
。(つまり、メソッドを使用するA
メソッドなど、または A から派生したクラスのメソッドを持つことができます。)
これの典型的な使用例は、DAO (Data Access Object) がある場合です。GenericDAO
ジェネリックメソッドのように、いくつかの基本的なメソッドを使用してジェネリック DAO を作成しsave
ます。他の DAO が を拡張できるようにするGenericDAO
には、そのクラスを でパラメータ化しEntity
、すべての が保存可能であることを確認しますEntity
。
次に、ユーザーがエンティティであるGenericDAO<Entity
場合など、その実装の束があります。UserDAO extends GenericDAO<User>
public class B extends C <A> {
}
タイプ Aパラメーターを受け入れるか返すかのいずれかで、またはその上位の で定義されたメソッドがない限り、これは何の意味もありません。Class C
そうすることで、 「タイプ A のオブジェクトを受け入れたり返したりできる」という制限を課すことで、タイプ セーフを確保しています。