『Javaフレーム構築ベース』Javaベースから-汎用的な可読性


一.コンパイラタイプチェック
  • 汎用型を導入した後、コード内の「public class Box」を「public class Box」に変更することによって汎用型の宣言を作成し、この宣言の背後には実質的にクラス内のどこでも使用できるタイプ変数Tが導入されている.例4に示すように、新しい汎用型宣言に加えて、元のコードに現れるすべてのObjectが型変数Tに置き換えられていることがわかる.
  • 型変数という言葉を一見すると少し難解に感じますが、よく考えてみると実は難しくないことがわかります.上記の例4は、「汎用を使用する場合、タイプパラメータTをBoxタイプ自体に渡すことができる」と理解でき、Oracleが与えた公式定義「汎用の本質はタイプパラメータ化である」と結びつけてより深く理解できます.
  • インスタンス5では、オブジェクト宣言と初期化の両方にタイプパラメータTが指定され、シーンの1つで、TはStringである.シーン2では,TはIntegerである.このように、シーン2でIntegerBoxにStringタイプのデータ「aaaa」を入力すると、プログラムがエラーとなります.インスタンス6の汎用集合オブジェクトの動作も同様であり、リストのboxesオブジェクトが宣言された後、boxesにIntegerオブジェクト11111が入力されると、プログラムはエラーを報告する.
  • では、汎用的な使用により、従来のマルチビジネスシーンでの問題が解決されていることがわかります.これは、コンパイル段階で、実行時に問題が暴露されるのではなく、以前のタイプの不一致の問題を解決することができるため、汎用的な使用を合理的に行えば、このようなリスクを大幅に回避することができます.汎用的な使用に対して,このパラメータ化タイプの役割は表面的には宣言であり,背後には約束である.

  • 二.可読性と柔軟性
  • 汎用型は、コンパイラタイプチェックや回避タイプ強制変換のほか、コードの可読性を効果的に向上させることができます.汎用型を使用しなければ,ビジネスシーンを知らない人が集合を操作している場合,リストに格納されているオブジェクトがどのようなタイプのオブジェクトなのか分からず,汎用型を使用すれば,そのタイプパラメータで現在のビジネスシーンを判断でき,コードの可読性も増すとともに,抽象継承に基づいて大胆に開発することができる.
  • の汎用的な使用上の柔軟性は、それ自体が実質的に使用上の強化であるため、多くの面で現れている.汎用型は具体的に動作するため、コンパイラがソースコードをコンパイルする際に、まず汎用型パラメータのチェックを行い、タイプの不一致などの問題を検出し、その後、タイプ消去を行い、同時にタイプパラメータが現れた位置に強制変換命令を挿入して汎用型を実現する.ブログ
  • 三.汎用メソッドと汎用クラスの比較
    例:
    public class A(){
        //        , T A   T   
        public T memberFunc(){
            return null;
        }
        //    ,   T   A T    
        public static  T genericFunc(T a){
            return null;
        }
        public static void main(String[] args) {
            //     
            //Integer i = A().findByUserName("s");
    
            //    
            Set set=  A().findByConditions("s");
        }
    }
  • ここでInteger i = A<String>().findByUserName("s");はエラーをコンパイルします:Error:(35, 61) java: : java.lang.String java.lang.Integer
  • この例から分かるように,汎用法のTとクラスAのTは異なる.