Java GenericsとWildcardsの理解
Java Genericsは、クラス、インターフェイス、および方法でタイプパラメーターを許可することにより、コンパイルタイムタイプの安全性を提供し、キャストを排除します。ワイルドカード(?、?拡張タイプ、?スーパータイプ)は、柔軟性で未知のタイプを処理します。 1.タイプが無関係で、オブジェクトとしてのみ読み取りが必要な場合、無制限のワイルドカードを使用します。 2。上に縛られたワイルドカードを使用を拡張します(たとえば、数字の合計)。 3。下にあるワイルドカードを使用アイテムを追加する消費者シナリオの場合(たとえば、リストに整数を追加します)。 PECSルールを覚えておいてください:プロデューサーは拡張、消費者スーパー。ジェネリックはタイプの消去を使用するため、タイプ情報は実行時に利用できないため、ジェネリックタイプ、ランタイムチェック、またはパラメーター化されたタイプの配列のインスタンス化が防止されます。生の種類や不必要なワイルドカードの返品タイプは避けてください。これらの原則を理解することで、JavaコレクションとAPIのコードの安全性と表現力が向上します。
Javaジェネリックとワイルドカードは、コードの再利用を促進しながらタイプセーフプログラミングを可能にする強力な機能です。 Java 5で導入され、クラス、インターフェイス、およびさまざまなタイプのオブジェクトを操作する方法を許可し、コンパイル時間にタイプエラーをキャッチしました。ただし、構文と動作、特にワイルドカードは、最初は混乱する可能性があります。それらを実用的な方法で分解しましょう。

Javaジェネリックとは何ですか?
ジェネリックでは、型パラメーターを使用したクラス、インターフェイス、およびメソッドを定義できます。 Object
とキャストを使用する代わりに、コレクション(または一般的なタイプ)が保持するオブジェクトの種類を指定できます。
例:

List <String> names = new ArrayList <>(); names.add( "Alice"); 文字列name = names.get(0); //キャストは必要ありません
ジェネリックがなければ、キャストする必要があります。
リストnames = new arrayList(); names.add( "Alice"); string name =(string)name.get(0); // ClassCastExceptionのリスク
ジェネリックは、鋳造の必要性を排除し、コンパイル時間タイプの安全性を提供します。

ワイルドカード:未知のタイプを扱う
時々、あなたが働いている一般的なコレクションの正確なタイプを知らないこともありますが、それでも安全に操作したいと思っています。それはワイルドカード( ?
)が入ってくるところです。
ワイルドカードには3種類あります。
1。バウンドのないワイルドカード( <?>
)
タイプを知っても気にしない場合は使用してください。
public void printlist(list <?> list){ for(オブジェクトアイテム:リスト){ System.out.println(item); } }
要素をObject
として読むことはできますが、実際のタイプが不明であるため、要素( null
を除く)を追加することはできません。
✅安全:
list.get(0)
list.add("hello")
2。上限のワイルドカード( <? extends Type>
)
タイプまたはそのサブタイプのいずれかを受け入れたいときは使用します。 「プロデューサー」シナリオで一般的です(コレクションから読む)。
public double sum(list <?extends number> number){ return numbers.stream() .maptodouble(number :: doublevalue) 。和(); }
このメソッドは、両方とも拡張Number
あるため、 List<Integer>
、 List<Double>
などを受け入れます。
ただし、繰り返しますが、 Number
として読むことはできますが、オブジェクト( null
を除く)を追加することはできません。正確なタイプがわからないためです。
corks:
sum(intList)
intList
がList<Integer>
である場合
obleできない:numbers.add(new Integer(5))
3。下部のワイルドカード( <? super Type>
)
タイプまたはそのスーパータイプのいずれかを受け入れたいときは使用します。 「消費者」シナリオで一般的です(コレクションに書き込みます)。
public void addnumbers(list <?super integer> list){ list.add(1); list.add(2); }
これは、 List<Integer>
、 List<Number>
、またはList<Object>
を受け入れます。
Integer
値を追加できますが、読むときは、それらがObject
であることを知っています。
✅追加可能:
list.add(42)
decaurty reading gives:Object obj = list.get(0);
PECSルール:プロデューサーは拡張、消費者スーパー
効果的なJavaからのこのニーモニックは、使用するワイルドカードを決定するのに役立ちます。
-
extends
→リストはプロデューサーです(そこからアイテムを取得/抽出します) -
super
→リストは消費者です(アイテムを入れて/追加)
例:
public static <t> void copy(list <?super t> dest、list <?extends t> src){ (tアイテム:src){ Dest.Add(item); } }
-
src
T
→使用を生成しますか? extends T
-
dest
消費T
→使用? super T
これがまさにCollections.copy()
設計方法です。
タイプの消去と制限
Javaのジェネリックがタイプの消去を使用していることを覚えておくことが重要です。型情報は実行時に削除されます。これはつまり:
- 一般的なタイプをインスタンス化することはできません:
new T()
❌ - ジェネリックタイプに基づくランタイムチェックはありません:
list instanceof List<string></string>
は違法です - パラメーター化されたタイプの配列を作成できません:
new List<string>[10]</string>
❌
これらの制限は、JVMが実行時に生のタイプのみを見るために存在します。
一般的な落とし穴
- ワイルドカードを不必要にリターンタイプとして使用しないでください。主にメソッドパラメーターでそれらを使用します。
- 生のタイプを避けてください(
List<string></string>
の代わりにList
など) - ジェネリックの目的を打ち負かします。 - ワイルドカードと一般的な方法を慎重に混ぜてください。一般的な方法が明確になる場合があります。
まとめ
- ジェネリックは、コンパイルタイムタイプの安全性を提供し、キャストを排除します。
- ワイルドカード(
?
、、extends
、super
)は、正確なタイプが不明な場合に柔軟性を処理します。 - PECを覚えておいてください:使用時に
extends
使用し、パッティング時にsuper
してください。 - タイプ消去はいくつかの用途を制限しますが、後方互換性を保持します。
これらの概念を理解することで、コレクション、ストリーム、およびAPIとの連携により、はるかに安全で表現力豊かになります。 PECとワイルドカードルールを内面化すると、それらは第二の性質になります。
以上がJava GenericsとWildcardsの理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Stock Market GPT
AIを活用した投資調査により賢明な意思決定を実現

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

最も直接的な方法は、通常はデスクトップ、ドキュメント、ダウンロードなどのフォルダーでストレージの場所を思い出すことです。見つからない場合は、システム検索機能を使用できます。ファイルの「欠落」は、主に保存パスの攻撃、名前メモリ偏差、ファイルの隠れ、またはクラウドの同期などの問題が原因です。効率的な管理の提案:プロジェクト、時間、タイプごとに分類し、迅速なアクセスを適切に使用し、定期的にクリーンでアーカイブし、命名を標準化します。ファイルエクスプローラーとタスクバーを検索および検索しますが、MacOSはFinderとSpotlightに依存しています。これはよりスマートで効率的です。ツールを習得し、良い習慣を開発することが重要です。

usefile.createNewfile()tocreatefileonlyifitdoes notexist、avolididingoverwriting;

-CPパラメーターを使用してJARをClassPathに追加して、JVMがjava-cplibrary.jarcom.example.mainなどの内部クラスとリソースをロードできるようにします。

実装キーワードを使用して、インターフェイスを実装します。クラスは、インターフェイス内のすべてのメソッドの特定の実装を提供する必要があります。複数のインターフェイスをサポートし、メソッドが公開されるようにコンマで区切られています。 Java 8の後のデフォルトおよび静的メソッドは、書き直す必要はありません。

最初に、ネットワーク接続が正常かどうかを確認します。他のWebサイトを開くことができない場合、問題はネットワーク上にあります。 1.ブラウザのキャッシュとCookieをクリアし、Chromeの設定を入力して、閲覧データをクリアします。 2。拡張機能を閉じると、スカレッレスモードを使用して、プラグインの競合によって引き起こされるかどうかをテストできます。 3.ネットワーク接続が傍受されないように、プロキシまたはVPN設定を確認して閉じます。 4. Chromeネットワーク設定をリセットし、デフォルトの構成を復元します。 5.互換性の問題を解決するために、Chromeを最新バージョンに更新または再インストールします。 6.他のブラウザを使用して比較およびテストして、問題がChromeのみであるかどうかを確認します。 err_connection_timed_outやerr_ssl_protocol_erなどのエラープロンプトに応じて

javagenericsprovideCompile-timeTypeSafeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTypeTyParaMetersonClasses、interfaces、and methods; wildcards(?、extendStype、?supertype)HeandnwondTypeswithFexibility.1.1.UnunboundCardCardCardCardCardCardCardCardCardCardCardの装備

DateTime.Strptime()メソッドを使用して、文字列をDateTimeオブジェクトに変換すると、フォーマッターと文字列が正確に一致するようにする必要があります。 2。一般的なフォーマッタには、%y(4ビット年)、%m(月)、%d(日)、%h(hour)、%m(minute)、%s(秒)などが含まれます。 3. AM/PMの時間に%Iと%Pを使用し、ISO形式にDateTime.FromisoFormat()を直接使用します。 4.フォーマットが一致しない場合、ValueErrorが発生します。 Dateutil.parser.parse()を使用して、複数の形式を扱うときに自動的に識別することをお勧めします。これらのメソッドを正しく使用すると、文字列をデイテティタイムオブジェクトに効率的に完了できます

リアルタイムシステムには、正確性が結果配信時間に依存するため、決定論的応答が必要です。ハードリアルタイムシステムには厳格な締め切りが必要であり、逃したことは災害につながりますが、ソフトリアルタイムは時折遅延を可能にします。スケジューリング、割り込み、キャッシュ、メモリ管理などの非決定的要因はタイミングに影響します。建設計画には、RTOの選択、WCET分析、リソース管理、ハードウェアの最適化、厳密なテストが含まれます。
