Javaのジェネリックとは何ですか? Java ジェネリックの詳細な紹介

不言
リリース: 2018-10-19 16:28:53
転載
3682 人が閲覧しました

この記事の内容は、Java のジェネリックとは何ですか? Java ジェネリックの詳細な紹介は、必要とする友人が参考にできることを願っています。

1. ジェネリックとは何ですか?
Java ジェネリック設計原則: コンパイル中に警告がない限り、実行時に ClassCastException 例外は発生しません。

ジェネリックス: 明確な型を処理します。オブジェクトの作成時またはメソッドの呼び出し時までは、明示的な特殊型です。

パラメータ化された型:

ArrayList の E は、型パラメータ変数と呼ばれます。 #ArrayList 内の整数は実際の型パラメータと呼ばれます

ArrayListジェネリック型

#ArrayList全体はパラメータ化された型と呼ばれます

2. ジェネリックが必要な理由は何ですか?

ジェネリックを使用すると:

コードがより簡潔になります [強制変換なし]
  • #プログラムはより堅牢です [コンパイル中に警告がない限り、実行時に ClassCastException 例外は発生しません]

  • 可読性と安定性 [コレクションを作成する際の型は制限されています]

  • コレクションを作成するときに、コレクションのタイプを指定するので、拡張された for を使用してコレクションを走査できるようになります。

    //创建集合对象
    ArrayList<String> list = new ArrayList<>();
    list.add("hello");
    list.add("world");
    list.add("java");
    
    //遍历,由于明确了类型.我们可以增强for
    for (String s : list) {
        System.out.println(s);
    }
    ログイン後にコピー
  • 3. ジェネリックの基本
ジェネリック クラスは、ユーザーがクラスを使用するときに型を明確にします。この場合、ユーザーは何を知っていますか。 type、このクラスはどのような型を表します... ユーザーは、これを使用するときに強制転送や実行時変換例外を心配する必要はありません。

クラスで定義されたジェネリックはクラス メソッドでも使用できます。

/*
    1:把泛型定义在类上
    2:类型变量定义在类上,方法中也可以使用
 */
    public class ObjectTool<T> {
        private T obj;
    
        public T getObj() {
            return obj;
        }
    
        public void setObj(T obj) {
            this.obj = obj;
        }
    }
ログイン後にコピー

ユーザーが使用したいタイプは、作成時にタイプを指定するだけです。使用すると、クラスはユーザーが使用したい型に自動的に変換されます。

public static void main(String[] args) {

//创建对象并指定元素类型
ObjectTool<String> tool = new ObjectTool<>();

tool.setObj(new String("钟福成"));
String s = tool.getObj();
System.out.println(s);


//创建对象并指定元素类型
ObjectTool<Integer> objectTool = new ObjectTool<>();
/**
 * 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了.
 */
objectTool.setObj(10);
int i = objectTool.getObj();
System.out.println(i);
ログイン後にコピー

}

ジェネリック メソッドを定義します.... ジェネリックは最初に定義されてから使用されます

//定义泛型方法..
public <T> void show(T t) {
    System.out.println(t);
}
ログイン後にコピー

ユーザーによって渡される型、戻り値は何ですか?

public static void main(String[] args) {
    //创建对象
    ObjectTool tool = new ObjectTool();

    //调用方法,传入的参数是什么类型,返回值就是什么类型
    tool.show("hello");
    tool.show(12);
    tool.show(12.5);

}
ログイン後にコピー

サブクラスはジェネリック クラスの型パラメータ変数を明確に定義します

/*
    把泛型定义在接口上
 */
public interface Inter<T> {
    public abstract void show(T t);
}
ログイン後にコピー

ジェネリック クラスを実装するクラスインターフェース...

/**
 * 子类明确泛型类的类型参数变量:
 */

public class InterImpl implements Inter<String> {
    @Override
    public void show(String s) {
        System.out.println(s);
    }
}
ログイン後にコピー

4. 汎用アプリケーション

Web ページを作成するときは、複数の DAO を毎回作成する必要があることがよくありますが、これは少し面倒な場合があります。

public abstract class BaseDao<T> {

    //模拟hibernate....
    private Session session;
    private Class clazz;


    //哪个子类调的这个方法,得到的class就是子类处理的类型(非常重要)
    public BaseDao(){
        Class clazz = this.getClass();  //拿到的是子类
        ParameterizedType  pt = (ParameterizedType) clazz.getGenericSuperclass();  //BaseDao<Category>
        clazz = (Class) pt.getActualTypeArguments()[0];
        System.out.println(clazz);

    }


    public void add(T t){
        session.save(t);
    }

    public T find(String id){
        return (T) session.get(clazz, id);
    }

    public void update(T t){
        session.update(t);
    }

    public void delete(String id){
        T t = (T) session.get(clazz, id);
        session.delete(t);
    }

}
ログイン後にコピー
抽象 DAO を継承し、実装クラスには追加、削除、変更、確認の対応するメソッドがあります。

rreeee

以上がJavaのジェネリックとは何ですか? Java ジェネリックの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート