Java Quickies.ジェネリック


序章


  • このシリーズは、Java の基本的な理解に専念する予定です. 「これはどのように機能するのですか?」と自問することがあります.ブログ投稿を作成し、ここに配置します.このシリーズは順不同ですので、最も関連性の高い投稿を自由に読んでください.この投稿に投稿したものはすべて、公式のジェネリック ドキュメント HERE に記載されています.

  • ジェネリックとは?


  • Java を使用したことがあれば、< > これらの 2 つの小さな山括弧を見たことがあると思います.Java でジェネリックが可能になるのは、それらのおかげです.ジェネリックにより、クラス、インターフェイス、またはメソッドを定義するときに、型 (クラスとインターフェイス) をパラメーターにすることができます.通常のメソッドでパラメータを定義する場合と同様です.違いは、メソッドへの入力は値を使用するのに対し、<> への入力は型 (クラス、インターフェイス)
  • であることです.

    ジェネリックを使用する理由


  • 主な理由は 2 つあります:

  • 1) : コンパイル時の型チェックを強化します.これは、コンパイラがエラーを検出できることを意味し、ランタイム エラーの一部を排除します.ランタイム エラーは、アプリをクラッシュさせるエラーです.

    2) : キャストの削除.キャストに慣れていない場合は、変数を別の型の変数として動作させるプロセスです.以下のキャストの使用例:

    List list = new ArrayList();
    list.add("hello");
    String s = (String) list.get(0);
    
    


  • ジェネリックのおかげで、次のようになります.

  • List<String> list = new ArrayList<String>();
    list.add("hello");
    String s = list.get(0);   // no cast
    
    


  • 2 番目の例では、(String) 構文がなくなっていることに注意してください.この変更は小さいように見えるかもしれませんが、エラーの排除に役立ちます.次に、非ジェネリック クラスとジェネリック クラスの例に移りましょう.

  • 非ジェネリック クラス




    public class Box {
        private Object object;
        public Box (Object object){
           this.object = object;
        }
        public void set(Object object) { this.object = object; }
        public Object get() { return object; }
    }
    
    Bob box = new Box("It do be like that sometimes")
    
    
    


  • 特定の型ではなく Object を使用したことに注意してください.これは、Object が Java の他のすべてのクラスのスーパー クラスであるためです.オブジェクトを使用すると、必要な任意のタイプのオブジェクトを使用できます. 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; }
    }
    
    Box<Integer> integerBox = new Box<Integer>(); 
    // creating a generic box
    
    


  • お気づきのように、ObjectT に置き換え、いくつかの山括弧を追加しただけです (詳細は後述).これにより、コンパイラはコードを実行する前に型チェックを行うことができ、実行時エラーが大幅に減少します.

  • ダイヤモンド <>


  • これまで見てきた 2 つの山かっこは、非公式に「ダイヤモンド演算子」と呼ばれています.その主な仕事は、Java でのジェネリックの使用を簡素化することです. Javaコードを見ると、この Box <Integer> intBox = new Box<>() のようなものを見たことがあると思いますが、空の <> はどういう意味ですか?簡単に言えば、コンパイラは型を推測しているので、それが何であるかを明示的に述べる必要はありません.

  • 結論



    -これはジェネリックの表面レベルの理解にすぎません.ドキュメント HERE を確認してください.
  • 私のこのブログ記事をお読みいただきありがとうございます.ご質問やご不明な点がございましたら、以下にコメントするか、 までご連絡ください.
  • また、他のプログラミング チュートリアルについては、私のチャンネルをチェックしてください.