Java汎型のTypeシステム

3658 ワード

Typeはjavaタイプの情報システムのトップインターフェースです。ここでClassはTypeの直接実現クラスです。また、Typeには4つの直接サブインターフェースがあります。Parameeterized Type、Type Varable、WildcardType、GenerayType。
        この仁兄のこれらのインターフェースに対する紹介を引用します。
      Type    すべての種類の共通インターフェースです。元のタイプ、パラメータタイプ、配列タイプ、タイプ変数、基本タイプが含まれます。Parameeterized Type、Type Varable、WildcardType、GenerayTypeの4つのインターフェースはすべてそのサブインターフェースです。    GeneraicDeclaration    このインターフェースClass、Method、Contstructorはすべて実現しています。私達はこのインターフェースのgetType Parameters方法を使って、Type Varable[]配列に戻ります。この配列の中には私達が定義したタイプ変数TとKがあります。順番は私達が宣言した時と同じです。ループステートメントで配列をプリントしたら、TとKだけが出力されます。これは私たちが望んだ結果ではないです。予想した結果を得るにはどうすればいいですか?引き続き下を見てください。    Type Varable    タイプ変数を表します。例えばT、例えばK extens Comprable スーパー T>&Serializableは、このインターフェースの中に、タイプ変数の上限を得るためのType配列があります。上限を定義していないと、デフォルト設定の上限はObjectです。Type Varableはインターフェースです。実際に得られたのはType Varableの実現類です。下のいくつかのインターフェースは同じです。    TとKを持って説明します。Tは上限が定義されていませんので、デフォルトの上限があります。実際にコードを追跡すると、Tのbounds属性は空です。get Bounds()メソッドを呼び出してから、Type[1]配列[class java.lang.Object]があります。Kにとっては、get Boundsのメソッドを呼び出した後、得られた配列は「java.lang.cmparable super T」であり、interface java.io.Serializable」であり、それらのタイプは違っています。1番目はParameterized Typeで、2番目はクラスです。    Parameeterized Type    Parameeterized Typeはパラメータ化タイプを表しています。つまり、前述のjava.lang.cmparable super Tです。また、List、Listなどはパラメータ化タイプです。Comprable super Tを取得した後、getRawType()とgetActual Type Argments()の2つの方法を呼び出すと、このパラメータ化タイプを宣言するクラス(java.lang.com)と実際のタイプのパラメータ配列([?super T])が得られます。super TはまたWildcardTypeタイプです。    WildcardType    ワイルドカードの表現を説明します。super Tはちょうどこのタイプです。そして、getUpperBounds()の上限とget LowerBounds()の下限の2つの方法を呼び出して、タイプ変数を取得しますか?この例のワイルドカード(?)の上限はjava.lang.Objectであり、下限はTであり、上のいくつかのインターフェースの分析によって、Person類の汎型パラメータを全部解析できます。Personのスーパークラス及び実現されたインターフェースはどのように処理されますか?Classクラスには同じく1.5バージョンにgetGeneranicSuperclass()とgetGeneraniInterfaces()の2つの方法が加わっており、バンドパラメータ化タイプのスーパークラスとインターフェースを返すために使われています。
    GeneraicArayTypeは実は一般的な配列タイプです。
   
            クラスはある程度消去されたタイプの情報を保存していると言っています。このいくつかのインターフェースを通じて消去されたタイプのパラメータ情報を取得できます。これらのインターフェースはタイプのパラメータに対する分類にすぎません。それらが提供したいくつかの方法によって、一番原始的なタイプのパラメータのクラスのオブジェクトをステップごとに取得できます。
            具体的な説明とAPIはみんなで文書を見に行きます。ここには実際の応用が記録されています。もちろん、さまざまな枠組みの中に応用がたくさんあります。
            JavaEEのDao層では、一般的には一般的に一般的な汎型BaseDaoをカプセル化し、User、Orderなどの各種エンティティに対する基本的なCRUDを実現できます。そして、具体的なUserDao、OrderDaoなどはそれを継承して、他のDao方法を提供します。
public class UserDao extends BaseDao{}
            私が使っているBaseDaoはDBUtilsに基づいています。エンティティのクラスのオブジェクトが必要です。例えばUserのクラスのオブジェクトは、構造関数、関数パラメータなどを通じてBaseDaoに伝えられますが、反射があって、より優雅に実現できます。
public class BaseDao {
	
	private Class clszz;
	
	public BaseDao(){
		Type type = this.getClass().getGenericSuperclass();//            
		if(type instanceof ParameterizedType){//  Type        ,     4     ,    BaseDao    
			ParameterizedType parameterizedType = (ParameterizedType) type;
			Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();//           
			if(actualTypeArguments != null && actualTypeArguments.length == 1){
				if(actualTypeArguments[0] instanceof Class){//          Class  
					this.clszz = (Class) actualTypeArguments[0];
				}else{
					//  : BaseDao>,       Class,   ParameterizedType,    
					ParameterizedType,      ,       User Class   
				}
			}
		}
	}
	
	public T get(String sql,Object...params){
		QueryRunner qr = new QueryRunner();
		T obj;
		Connection connection;
		try {
			connection = JdbcUtil.getConnection();
			obj = qr.query(connection,sql,new BeanHandler(clszz),params);
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		return obj;
	}
}