まず、ジェネリックの起源は使用することです
ジェネリックの起源ジェネリックの起源
:オブジェクト変換の問題から導入
初期のオブジェクトタイプは任意のオブジェクトタイプを受け取ることができますが、実際の使用では、
タイプ変換に問題があります。この隠れた危険性があるため、Javaはこのセキュリティ問題を解決するためのジェネリックを提供します。
ジェネリックを使用すると、クラスのジェネリックが定義されます。
形式:public class 类名<泛型类型1,…>
注:ジェネリックタイプは参照タイプである必要があります。
クラスを使用してオブジェクトを作成する場合は、ジェネリックを指定してください。つまり、渡されるのは一般的なものです
public class Tool<Q> {
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
}
public void show(Q q) {
System.out.println(q);
}
}
public static void main(String[] args) {
Tool<String> tool =new Tool<String>();
//创建工具类对象
tool.show("abc");
}
結果が出力されます:abc
メソッドのジェネリックを定義します。
フォーマットを定義します。public <泛型类型> 返回类型 方法名(泛型类型 变量名)
public class Tool<Q> {
private Q q;
public Q getObj() {
return q;
}
public void setObj(Q q) {
this.q = q;
} //注意此处区别,参数括号里面为T
public<T> void show(T q) {
//方法泛型最好与类的泛型一致
System.out.println(q);
//如果不一致,需要在方法上声明该泛型
}
}
Tool<String> tool =new Tool<String>();
//创建工具类对象
//tool.show("abc");
tool.show(true);
印刷結果は真です。
ヒント:ここのメソッドが静的メソッドに変更された場合、戻り値はエラー値を示します。静的メソッドは、クラスがロードされるときにロードされます。静的メソッドは、独自のジェネリックを宣言する必要があります。つまり、public
static void Printable(W w)です。クラスの汎用タイプは、オブジェクトの作成時に割り当てられ、静的メソッド(W
w)が呼び出されたときに静的が割り当てられます。
インターフェイスでジェネリックを定義します。
形式を定義します。public interface 接口名<泛型类型>
方法1 :(推奨)
interface Inter<T>{
public void show(T t);
}
//当我们规定接口泛型为String的时候,那么我们的方法也是String
class Demo implements Inter<String>{
@Override
public void show(String t) {
System.out.println(t);
}
}
メソッド2:
//このメソッドは主に関数を実装するためのものであり、独自のクラスにジェネリックを追加する必要はありません。このように、オブジェクトを作成するときにジェネリックを指定する必要があります。
class Demo<T> implements Inter<T>{
@Override
public void show(T t) {
System.out.println(t);
}
}
2.一般的な高度なワイルドカード
一般的なワイルドカード:<?>
任意のタイプ、明確でない場合は、オブジェクトおよび任意のJavaクラス
開発を行うとき、後でどのタイプを受け入れるかわからず、後でコレクションまたはオブジェクトを返すためにメソッドが呼び出される可能性があり、データタイプが不明です。現時点で前に置くことはできますか?任意のタイプを表します
右側のジェネリックタイプが不明な場合、左側は?として指定できます。
List<?> list =new ArrayList<String>();
- ?Eの
下限、Eとそのサブクラスを拡張しますか?子クラスを表しますEは親クラスを表します
ArrayList<Person> list1 =new ArrayList<Person>();
list1.add(new Person("张三", 12));
list1.add(new Person("李四", 13));
list1.add(new Person("王五", 14));
//这样可以放进去的原因时,Student必须是继承Person才能放进去。
//此时Student往上提升,调用Person类中的toString方法
ArrayList<Student> list2 =new ArrayList<Student>();
list2.add(new Student("赵六", 15));
list2.add(new Student("周七", 16));
list1.addAll(list2);
System.out.println(list1);
効果は次のとおりです。
- ?スーパーE
は上限に制限されており、 Eのメソッドとその親クラス
がTreeSetコレクションに導入されます。