あなたがメソッドを持っているとき、私はそれをジェネリックと宣言することが理にかなっていることを理解しています。そうすれば私はジェネリック引数を取ることができます。このような:
public <T> void function(T element) {
// Some code...
}
しかし、すべてのメソッドを単純にジェネリックと宣言できる場合、クラス全体をジェネリックにする背後にある考え方は正確には何ですか?
違いは、クラスの各メソッドをジェネリックにしようとすると、firstGenericMethodで使用するジェネリック型が同じ型である場合とそうでない場合があります。つまり、
public <T> void firstGenMethod(...){
}
public <T> void secondGenMethod(...){
}
テスト:
SomeClass ref = new SomeClass();
ref.firstGenMethod("string");
ref.secondGenMethod(123);//legal as this generic type is not related to the generic type which is used by firstGenMethod
上記の場合、両方のメソッドが同じジェネリック型を持っているという保証はありません。それは、それらをどのように呼び出すかによって異なります。ただし、クラスをジェネリックにすると、その型はそのクラス内のすべてのメソッドに適用されます。
class Test<T>{
public void firstGenMethod(T t){
}
public void secondGenMethod(T t){
}
}
テスト:
Test<String> testingString = new Test<>();
testingString.firstGenMethod("abc");
testingString.firstGenMethod(123);// invalid as your Test class only expects String in this case
通常、クラスの動作(メソッド)全体を同じタイプで処理する場合は、クラスをジェネリックにします。最良の例は、Javaコレクションフレームワークのクラスです。
コレクションクラスをご覧ください。List<T>
例として取り上げます。クラスがジェネリックとして宣言されていない場合、正しいクラスの要素のみをリストに挿入できるようにするにはどうすればよいでしょうか。そして、電話をかけたときに何が得られるかをどうやって知るのでしょうArrayList.get(i)
か?
正確には、このクラスのすべてのメソッドが特定の型に適用されるようにするためです。
これは通常、「コンテナ」クラスで使用されます。リストを作成していて、それを汎用にする場合は、要素の追加、要素の取得、反復などが常に同じタイプを使用するようにする必要があります。
おっしゃるように、これにより、特定のタイプのインスタンス変数を使用し、いくつかのメソッドでこのインスタンスを一貫した方法で使用することができます(おそらく、インスタンスを返す、影響を与える...)。
いくつかの異なるタイプの「ジェネリック」クラスがある場合は、実際に2つのジェネリッククラスを1つに記述していることを示している可能性があります...(これは正当なことかもしれませんが)。
主なアイデアは、型のクラス/メソッドをバインドすることです。最良の例は、Generics
プログラミング言語の概念です。これは、ポリモーフィズムの実際のアプリケーションです。
汎用クラスは、特定のデータ型に固有ではない操作をカプセル化します。ジェネリッククラスの最も一般的な使用法は、リンクリスト、ハッシュテーブル、スタック、キュー、ツリーなどのコレクションであり、コレクションからのアイテムの追加や削除などの操作は、データの種類に関係なくほぼ同じ方法で実行されます。保存されます。
コレクションクラスを必要とするほとんどのシナリオでは、プログラミング言語で提供されているものを使用することをお勧めします。oracle docs
からの参照ジェネリック型は、型に対してパラメーター化されたジェネリッククラスまたはインターフェースです。
public class Box {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
一般的に、あなたはそれをに厳密にすることができます
public class Box<T> {
// T stands for "Type"
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
また、このチュートリアルをご覧になることをお勧めします