余談
私は2週間ブログを書いていますが、最初から始め方がわかりません。今では、ブログの投稿が1,000を超えて読まれ、大物から賞賛されています。一方で、記録することができます。私自身の学びと知識を他の人と共有します。幸せなことに、9列の農家として私を支えてくれることを願っています。
ジェネリック
概念:
汎用、つまり「パラメーター化された型」。メソッドの変数パラメーターと同様に、元の特定の型から型をパラメーター化することです。このとき、型はパラメーター形式(型パラメーターと呼ぶこともできます)として定義され、特定の型は次のようになります。使用/呼び出し時に渡されます(タイプ引数)。
使用する
以前に使用したジェネリックから始めましょう
package week.third.test;
import java.util.ArrayList;
public class Demo3 {
public static void main(String[] args) {
//创建集合不给出泛型
ArrayList list = new ArrayList();
list.add("h");
list.add("a");
//遍历集合
for (Object obj : list){
System.out.println(obj);
}
//进行遍历,打印出每个字符串长度
for (Object obj : list) {
String str = (String) obj;/*此处练习了向下转型*/
System.out.println(str.length());
}
//创建集合给出泛型
ArrayList<String> list2 = new ArrayList<>();
//添加元素
list2.add("h");
list2.add("o");
//list2.add(100);编译的时候就会报错,如果没有给出泛型,则不会报错
//使用增强for遍历集合
for (String str2 : list2
) {
System.out.println(str2);
}
}
}
ジェネリッククラス
定义一个泛型类:
public class ClassName<T>{
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
汎用インターフェース:
public interface IntercaceName<T>{
T getData();
}
实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下:
指定类型:
public class Interface1 implements IntercaceName<String> {
private String text;
@Override
public String getData() {
return text;
}
}
不指定类型:
public class Interface1<T> implements IntercaceName<T> {
private T data;
@Override
public T getData() {
return data;
}
}
一般的な方法:
private static <T> T 方法名(T a, T b) {
}
一般的な制限タイプ
ジェネリックを使用する場合、ジェネリックの限定された領域を指定できます。
たとえば、特定のクラスのサブクラスまたは特定のインターフェイスの実装クラスである必要があります。形式:<T extends class or interface 1&interface 2>
ジェネリック医薬品の役割
1.コードの再利用率を向上させます
。2。ジェネリックスの型は使用時に指定され、型変換は必要ありません(型の安全性、コンパイラーが型をチェックします)
予防:
コンパイル後、プログラムは縮退するための対策を講じます。つまり、Javaのジェネリックは、コンパイル段階でのみ有効です。コンパイルプロセスでは、ジェネリック結果が正しくチェックされた後、ジェネリックの関連情報が消去され、メソッドに出入りするオブジェクトの境界に型チェックと型変換のメソッドが追加されます。つまり、一般的な情報は実行時フェーズに入りません。
大きなことについて話すための専用の見出し!
1. Javaのジェネリックとは何ですか?ジェネリックを使用する利点は何ですか?
ジェネリックスは、型をパラメーター化するためのメカニズムです。コレクションフレームワークなど、より一般的なコードを記述できるように、コードをさまざまなタイプに適用できるようにすることができます。ジェネリックスは、コンパイル時の型確認メカニズムです。コンパイル時に型の安全性を提供し、正しい型のオブジェクトのみがジェネリック型(通常はジェネリックコレクション)で使用できるようにし、実行時のClassCastExceptionを回避します。
2. Javaジェネリックはどのように機能しますか?型消去とは何ですか?
ジェネリックスの通常の作業は、コンパイラーに依存して、ソースコードをコンパイルするときに最初に型チェックを実行し、次に型消去を実行し、型パラメーターが表示される場所に強制に関連する命令を挿入します。コンパイラはコンパイル時にすべての型関連情報を消去するため、実行時に型関連情報はありません。たとえば、リストは実行時に1つのリストタイプのみで表されます。なぜそれを消したいのですか?これは、型の拡張を避けるためです。
3.ジェネリックスの修飾ワイルドカードと非修飾ワイルドカードとは何ですか?
修飾されたワイルドカードはタイプを制限します。修飾されたワイルドカードは2つあります。1つは<?extends T>で、タイプがTのサブクラスである必要があることを確認してタイプの上限を設定し、もう1つは<?superT>で、タイプがTのスーパークラス型の下限を設定します。ジェネリック型は、制限内の型で初期化する必要があります。そうしないと、コンパイルエラーが発生します。一方、<?>は任意のタイプに置き換えることができるため、<?>は修飾されていないワイルドカードを表します。
4. List <?extendsT>とList <?super T>の違いは何ですか?
これらの2つのリスト宣言は修飾されたワイルドカードの例です。List<?extends T>はTから継承されたすべてのリストを受け入れることができ、List <?superT>はTの親クラスによって形成されたすべてのリストを受け入れることができます。たとえば、List <?extends Number>は、ListまたはListを受け入れることができます。
5.ジェネリックパラメーターを受け入れてジェネリック型を返すことができるようにジェネリックメソッドを作成するにはどうすればよいですか?
ジェネリックメソッドを作成することは難しくありません。T、E、K、Vなどの広く認識されているタイププレースホルダーを使用するなど、プリミティブ型をジェネリック型に置き換える必要があります。
6.ジェネリックスを使用してJavaでパラメーターを持つクラスを作成するにはどうすればよいですか?
これは、前のインタビューの質問の延長です。インタビュアーは、ジェネリックメソッドを作成する代わりに、ジェネリックを使用してタイプセーフクラスを作成するように依頼する場合があります。重要なのは、プリミティブ型の代わりにジェネリック型を使用し、JDKで使用される標準のプレースホルダーを使用することです。
7. LRUキャッシングを実装するためのジェネリックプログラムを作成しますか?
Javaプログラミングが好きな人にとって、これは演習に相当します。ヒントを教えてください。LinkedHashMapを使用して、固定サイズのLRUキャッシュを実装できます。LRUキャッシュがいっぱいになると、最も古いキーと値のペアがキャッシュから削除されます。LinkedHashMapは、removeEldestEntry()というメソッドを提供します。このメソッドは、put()およびputAll()によって呼び出され、最も古いキーと値のペアを削除します。
8.リストパラメータを受け入れるメソッドにリストを渡すことはできますか?
ジェネリックスに精通していない人にとって、このJavaジェネリックスのトピックは混乱しているように見えます。これは、一見文字列は一種のオブジェクトであるため、リストが必要な場合はリストを使用する必要がありますが、そうではありません。これを行うと、コンパイルエラーが発生します。さらに考えてみると、Listは文字列、整数などを含むあらゆるタイプのオブジェクトを格納できるのに対し、Listは文字列の格納にのみ使用できるため、Javaがこれを行うのが理にかなっていることがわかります。
ナンセンスな時間:
お客様が食べ物が適切だと思ったら、無料のようにあげてもらえますか?ありがとうございました!スローウォーカーオフィサー!梱包して集めて、次回また来ることをお勧めします。Xiaoer QQ:309021573を購入して、嫌がらせへようこそ!