Java関連求助---Java汎用型の理解と等価実現---完全に理解されていません...大神に指導してもらう...

35313 ワード

1.汎用型はJava 1.5の新しい特性であり、汎用型の本質はパラメトリック型であり、すなわち動作するデータ型は1つのパラメータとして指定される.このパラメータタイプは、クラス、インタフェース、およびメソッドの作成に使用できます.それぞれ、汎用クラス、汎用インタフェース、汎用メソッドと呼ばれます.
2.Java汎用が導入されたメリットは、セキュリティが簡単であることです.
Java SE 1.5以前に汎用型がなかった場合,型Objectへの参照によりパラメータの「任意化」が実現され,「任意化」がもたらす欠点は明示的な強制型変換を行うことであり,この変換は開発者に実際のパラメータ型が予知可能である場合に行われることである.強制タイプ変換エラーの場合、コンパイラはエラーを提示せず、実行時に異常が発生する可能性があります.これはセキュリティ上の危険です.
汎用型の利点は、コンパイル時にタイプのセキュリティをチェックし、すべての強制変換が自動的で暗黙的であり、コードの再利用率を向上させることです.
汎用型の使用には、いくつかのルールと制限があります.
1、汎用型のタイプパラメータはクラスタイプ(カスタムクラスを含む)のみで、単純なタイプではありません.
2、同じ汎用型は複数のバージョン(パラメータタイプが不確定であるため)に対応することができ、異なるバージョンの汎用クラスインスタンスは互換性がない.
3、汎用型のタイプパラメータは複数あります.
4、汎用パラメータタイプはextends文、例えば.習慣的には「有界タイプ」になります.
5、汎用型のパラメータタイプはワイルドカードタイプであってもよい.例えばClass classType=Class.forName(java.lang.String);
汎用型にはインタフェースや方法など、内容が多く、理解して使いこなすには工夫が必要です.ここで私がかつて汎用型を知っていたときに書いた2つの例(見た印象に基づいて書いた)を示して、同じ機能を実現して、1つは汎用型を使って、1つは使っていないで、比較を通じて、すぐに汎用型の応用をマスターすることができて、この基本的に汎用型の70%の内容をマスターしました.
例1:Java汎用を使用
------------------------------------------------------------------------------------------------
ここでjavase 1を使いました.6、でもやっぱり間違いが・・・具体的なエラー以下では、エラーを修正すると汎用的な役割を果たせないか、強制的なタイプ変換が必要かといったセキュリティ上の問題が発生します
------------------------------------------------------------------------------------------------------

 
  1. publicclassGen{ // , Gen<T>,
  2.  privateTob;//
  3.  publicGen(Tob){
  4. this.ob=ob;
  5.  }
  6.  publicTgetOb(){
  7. returnob;
  8.  }
  9.  publicvoidsetOb(Tob){
  10. this.ob=ob;
  11.  }
  12.  publicvoidshowTyep(){
  13. System.out.println("T :"+ob.getClass().getName());
  14.  }
  15. }
  16. publicclassGenDemo{
  17.  publicstaticvoidmain(String[]args){
  18.  // Gen Integer
  19.  GenintOb=newGen(88);
  20.  intOb.showTyep();
  21.  inti=intOb.getOb();// ,
  22.  System.out.println("value="+i);
  23.  System.out.println("----------------------------------");
  24.  // Gen String
  25.  GenstrOb=newGen("HelloGen!");
  26.  strOb.showTyep();
  27.  Strings=strOb.getOb();// ,
  28.  System.out.println("value="+s);
  29. }
  30. }

例2:汎用型を使用していない

 
  1. publicclassGen2{
  2.  privateObjectob;//
  3.  publicGen2(Objectob){
  4. this.ob=ob;
  5.  }
  6.  publicObjectgetOb(){
  7. returnob;
  8.  }
  9.  publicvoidsetOb(Objectob){
  10. this.ob=ob;
  11.  }
  12.  publicvoidshowTyep(){
  13. System.out.println("T :"+ob.getClass().getName());
  14.  }
  15. }
  16. publicclassGenDemo2{
  17.  publicstaticvoidmain(String[]args){
  18. // Gen2 Integer
  19. Gen2intOb=newGen2(newInteger(88));
  20. intOb.showTyep();
  21. inti=(Integer)intOb.getOb();
  22. System.out.println("value="+i);
  23. System.out.println("----------------------------------");
  24. // Gen2 String
  25. Gen2strOb=newGen2("HelloGen!");
  26. strOb.showTyep();
  27. Strings=(String)strOb.getOb();
  28. System.out.println("value="+s);
  29.  }
  30. }

実行結果:
2つの例ではDemoの実行結果は同じであり、コンソールの出力結果は以下の通りである.
Tの実際のタイプは:

 
  1. java.lang.Integer
  2. value=88
  3. ----------------------------------
  4. T :java.lang.String
  5. value=HelloGen!
  6. Processfinishedwithexitcode0
  7. ------------------------------------------------------------