Javaでジェネリック医薬品の分析

序文

ジェネリックは、JavaのJava SE 1.5の新機能、データ型の操作がパラメータとして指定されていると言うことですジェネリック型パラメータの本質です。このパラメータの種類は、一般的なメソッドが呼び出され、クラス、インターフェイスやメソッド、ジェネリッククラス、一般的なインターフェースの作成に使用することができます。

ジェネリック(ジェネリック型またはジェネリック)はタイプによってパラメータ化することができ、クラスの作成をサポートするためのJava言語の型システムを拡張したものです。仮パラメータの転送方法は、同じ実行時のプレースホルダの値であるとして、プレースホルダの種類を使用してパラメータ化された型パラメータの種類によって指定されたとみなすことができます。

なぜジェネリック

問題へ

1.5ジェネリックはJava SEで導入されているあなたは言葉のコレクションを使用する場合は、その前に、どのようなものですか?メソッドリストのセットの場合、入力されたデータは、パラメータを追加するために追加し、Object型のどのデータの種類を追加し、入力することができるという意味です。

List list = new ArrayList();
	list.add("abc");
	list.add("cdf");
复制代码

しかし、トラブルから抜け出すために少し簡単に追加すること。私たちは、キャストを取る必要があるため。

String s = (String) list.get(0);
复制代码

時々、私たちはどのような種類が追加の忘れて、または他の人がミスを犯すことは非常に簡単になります。この時間を使用したいときに我々は、我々がどのようなタイプがわからないので、そのときに実行されます、メソッドを書きます例外が発生しました。

List list = new ArrayList();
		list.add("abc");
		list.add("cdf");
		list.add(12);
		list.add(23.9);

		for (int i = 0; i < list.size(); i++) {
			String tempString = (String) list.get(i);
			System.out.println(tempString);
		}
复制代码

ここに画像を挿入説明

ソリューション

原因上記のような問題のために、我々はそれにデータを追加するとき、我々は、つまり、入ってくるデータの種類を定義することによって解決することができる特定のタイプに限定され、他の種類のデータを追加し行っていない、このような場合は、我々は非常に簡単になりますこの問題を解決します。このメソッドは、ジェネリック言うことには、次の必要性です。

List<String> list = new ArrayList<>();
		list.add("abc");
		list.add("cdf");
复制代码

定義型の文字列を通過追加、これは、上記の問題を回避するように、コンパイル時に検出することができます。

一般的な分類

一般的な3つの異なる方法、すなわち:ジェネリッククラス、ジェネリックインターフェイス、ジェネリックメソッド。

ジェネリッククラス

より抽象的な一般的なクラスをいえば、例を見てみましょう:

/**
 * 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
 * 
 * @author admin
 *
 * @param <T>
 */
public class Generic<T> {

	/**
	 * 这个成员变量的类型为T,T的类型由外部指定
	 */
	private T t;

	/**
	 * 泛型构造方法形参t的类型也为T,T的类型由外部指定
	 * 
	 * @param t
	 */
	public Generic(T t) {
		super();
		this.t = t;
	}

	/**
	 * 泛型方法getT的返回值类型为T,T的类型由外部指定
	 * 
	 * @return
	 */
	public T getT() {
		return t;
	}

	/**
	 * 泛型方法setT的参数类型为T,T的类型由外部指定
	 * 
	 * @param t
	 */
	public void setT(T t) {
		this.t = t;
	}
}
复制代码

ジェネリッククラスは比較的簡単です、あなたはパラメータの型Tを指定する必要があり、その後、外部から輸入し、我々は、その使用の一般的なクラスを見てみましょう。

//泛型参数T这里指定为String类型
Generic<String> generic = new Generic<String>("Hello");
System.out.println(generic.getT());
复制代码

次のように印刷結果は以下のとおりです。

Hello
复制代码

:ことに留意すべきであるのみ(カスタムクラスを含む)ジェネリック型パラメータのクラス型は、単純型にすることはできません。

ジェネリックインターフェイス

実質的に同じを使用してジェネリッククラスとジェネリックインターフェイスの定義。我々はまた、例を挙げて見てみましょう:

/**
 * 定义一个泛型接口
 * 
 * @author admin
 *
 * @param <T>
 */
public interface IGeneric<T> {

	T result();

}
复制代码

一般的なインタフェース、この汎用インタフェースの使用を定義し、2つのケースがあります。

一般的なパラメータが渡されていません
/**
 * 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
 * 
 * @author admin
 *
 * @param <T>
 */
public class Generic1Test<T> implements IGeneric<T> {

	@Override
	public T result() {
		return null;
	}

}
复制代码
受信パラメータの型
/**
 * 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型
 * 
 * @author admin
 *
 */
public class Generic2Test implements IGeneric<String> {

	@Override
	public String result() {

		return "";
	}
}
复制代码

一般的な方法

一般的な方法は、方法は、特定のジェネリック型に指定されたときに呼び出されるが、一般的なクラスに関して、一般的な方法は、より複雑であるが、我々は具体的な例を見てみましょう。

/**
	 * 声明一个泛型方法,该泛型方法中带一个T类型形参,
	 * 
	 * @param <T>
	 * @param a
	 * @param c
	 */
	static <T> void fromArrayToCollection(T[] a, List<T> c) {
		for (T o : a) {
			c.add(o);
		}
	}
复制代码

、公共これは一般的な方法であることを示しており、一般的なTを宣言し、戻り値との間の第一の必須のジェネリックメソッドを宣言すると、Tは、この一般的な方法のどこにでも現れることができますこれは、一般的な任意の数の数であってもよいです。

比較的より複雑に述べた一般的なパラメータについては、専門の必要性が後で説明します。

一般的なワイルドカード

汎用的なインタフェースは、多くの場合、T、E、K、Vのように異なるのワイルドカード、多くのに実行したときに私たちは、ジェネリッククラス、ジェネリックメソッドを定義,? そしてその上、これらはワイルドカードであり、その平均値を何?

実際には、これらの異なるワイルドカードには本質的な違いはありませんが、Javaの開発プロセスでは、我々は、これらの異なるワイルドカードの表現の意味に合意したものと同じではありません。

  1. 未定義の型のJavaを表します
  2. T(タイプ)は、特定の型のJavaで表され
  3. KV(キー値)は、Javaキーキー、値を表します
  4. 要素の代わりにE(要素​​)

無制限ワイルドカード<?>

私たちは、Listなどで無制限のワイルドカード、として理解することができ、主な役割は、データの未知のタイプを受け入れることができますジェネリック医薬品のワイルドカードを作ることです。ジェネリック型はメソッド宣言に一度だけ表示された場合は、ワイルドカード<使用できますか?>それを交換してください。

私たちは指摘する:一覧リストとの一覧リストの違い<?>:を

  1. <?>リストリストには、リストには、オブジェクトの特定の型を保持されますが、どのタイプか分からない、一覧リストは、リスト型のオブジェクトは、オブジェクトを保持しています。
  2. 一覧<?>リストオブジェクトのいずれかのタイプを追加することができますので、あなたがオブジェクトの任意の型を追加することはできませんので、彼らは、保持の実際の型を知りませんが、オブジェクトの所有のための一覧リストは、Object型であるため。

注:<?> nullが任意の参照データ型は要素を持っているので、一覧リストは、(null)を追加することができます。

上限ワイルドカードは、<?Eを拡張>

使用すると、キーワードの文を拡張パラメータ化された型は、クラスのタイプまたはサブタイプによって指定することができ表します。

バインドされたワイルドカードを下げ<?スーパーE>

スーパーで宣言され、タイプを示すパラメータが指定された型、又はオブジェクトまでこのタイプのスーパータイプのものであってもよいです。

ジェネリック消去

JavaのジェネリックJavaはコンパイル時に、すべての一般的な情報が消去され、最も重要な前提条件の正しい理解がジェネリック型消去の概念を理解することであるため、擬似ジェネリック医薬品です。一般的なJavaコンパイラこのレベルで基本的にコンパイラのコンパイルは、ジェネリック型パラメータの使用と組み合わされたとき、バイトコードは、ジェネリックに含まれる情報の種類に発生しない、達成されます。消去するプロセスのこのタイプを削除する時期。

たとえば:リストタイプの場合、コンパイラはリストになり、リストJVMだけで見ますが、JVMに関する追加情報のジェネリック型では表示されません。Javaコンパイラは、コンパイル時に可能な限りとして間違っている可能性がものを発見します。

私たちは、一般的な消去を説明するための例を与えます:

public static void main(String[] args) {
		List<String> strList = new ArrayList<String>();
		strList.add("AAAAA");

		List<Integer> intList = new ArrayList<>();
		intList.add(123);

		System.out.println("编译时期类型是否相同: " + (strList.getClass() == intList.getClass()));
	}
复制代码

次のように印刷結果は以下のとおりです。

ここに画像を挿入説明

上記の例から見た、我々は、2つの配列のArrayListを定義するが、ArrayListには、唯一の文字列を格納できる汎用タイプであり、ArrayListのが一般的なタイプでのみ最後の整数を格納することができ、我々オブジェクトLIST1とgetClass LIST2オブジェクト()メソッドは、そのメッセージクラスを取得し、最終的には結果が真でいます。DESCRIPTIONジェネリック型整数と文字列のみを元の型を残して、消去されています。

ジェネリックのメリット

ジェネリック医薬品の導入で、Java言語は、より大きな機能強化です。だけでなく、言語、型システムとコンパイラがジェネリックをサポートするために大幅な変更を加えており、ライブラリはまた、コレクションフレームワークなどの主要な改築、非常に多くの重要なクラス、されている、それはの総称となっています。

  1. 安全性を入力します。主な目的は、一般的なタイプセーフなJavaプログラムを改善することです。
  2. 強制転換の排除。ジェネリック医薬品の副次的な利点は、ソースコード内の多くのキャストを除去することです。これは、コードが読みやすくなり、エラーの機会を減らします。

概要

上記の例で引用したが、いくつかの簡単な例であるだけで、簡単に、一般的な概念を説明し、実用的なアプリケーションを持っていません。唯一の一般的な開発プロセスのための一般的なとしてこの記事簡潔で説明にも、深く探求する私たちを必要とする滞在が調整されたので、後者は、再びジェネリック品の深い理解アウトとなります。

著者について

Androidの開発に注力長年にわたり、書き込みブログのレコードを好きでは〜、私のブログのパブリック番号、歓迎みんなの注目の同期更新を学習経験について話すことができまとめます

ここに画像を挿入説明

おすすめ

転載: juejin.im/post/5ddfc1336fb9a071594b3cc6