目次
Javaジェネリックとは何ですか?
ワイルドカード:未知のタイプを扱う
1。バウンドのないワイルドカード(
2。上限のワイルドカード(
3。下部のワイルドカード(
PECSルール:プロデューサーは拡張、消費者スーパー
タイプの消去と制限
一般的な落とし穴
まとめ
ホームページ Java &#&チュートリアル Java GenericsとWildcardsの理解

Java GenericsとWildcardsの理解

Sep 20, 2025 am 01:58 AM
java プログラミング

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

Java GenericsとWildcardsの理解

Javaジェネリックとワイルドカードは、コードの再利用を促進しながらタイプセーフプログラミングを可能にする強力な機能です。 Java 5で導入され、クラス、インターフェイス、およびさまざまなタイプのオブジェクトを操作する方法を許可し、コンパイル時間にタイプエラーをキャッチしました。ただし、構文と動作、特にワイルドカードは、最初は混乱する可能性があります。それらを実用的な方法で分解しましょう。

Java GenericsとWildcardsの理解

Javaジェネリックとは何ですか?

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

例:

Java GenericsとWildcardsの理解
 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のリスク

ジェネリックは、鋳造の必要性を排除し、コンパイル時間タイプの安全性を提供します。

Java GenericsとWildcardsの理解

ワイルドカード:未知のタイプを扱う

時々、あなたが働いている一般的なコレクションの正確なタイプを知らないこともありますが、それでも安全に操作したいと思っています。それはワイルドカード? )が入ってくるところです。

ワイルドカードには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) intListList<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など) - ジェネリックの目的を打ち負かします。
  • ワイルドカードと一般的な方法を慎重に混ぜてください。一般的な方法が明確になる場合があります。

まとめ

  • ジェネリックは、コンパイルタイムタイプの安全性を提供し、キャストを排除します。
  • ワイルドカード( ? 、、 extendssuper )は、正確なタイプが不明な場合に柔軟性を処理します。
  • PECを覚えておいてください:使用時にextends使用し、パッティング時にsuperしてください。
  • タイプ消去はいくつかの用途を制限しますが、後方互換性を保持します。

これらの概念を理解することで、コレクション、ストリーム、およびAPIとの連携により、はるかに安全で表現力豊かになります。 PECとワイルドカードルールを内面化すると、それらは第二の性質になります。

以上がJava GenericsとWildcardsの理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Stock Market GPT

Stock Market GPT

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

フォルダを見つける場所 フォルダを見つける場所 Sep 20, 2025 am 07:57 AM

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

Javaでファイルを作成する方法 Javaでファイルを作成する方法 Sep 21, 2025 am 03:54 AM

usefile.createNewfile()tocreatefileonlyifitdoes notexist、avolididingoverwriting;

JavaのClassPathにJARファイルを追加する方法は? JavaのClassPathにJARファイルを追加する方法は? Sep 21, 2025 am 05:09 AM

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

Javaにインターフェイスを実装する方法は? Javaにインターフェイスを実装する方法は? Sep 18, 2025 am 05:31 AM

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

Google Chromeはこのページをロードできません Google Chromeはこのページをロードできません Sep 20, 2025 am 03:51 AM

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

Java GenericsとWildcardsの理解 Java GenericsとWildcardsの理解 Sep 20, 2025 am 01:58 AM

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

Pythonは文字列をDateTimeの例に変換します Pythonは文字列をDateTimeの例に変換します Sep 18, 2025 am 02:34 AM

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()を使用して、複数の形式を扱うときに自動的に識別することをお勧めします。これらのメソッドを正しく使用すると、文字列をデイテティタイムオブジェクトに効率的に完了できます

なぜリアルタイムシステムが決定論的応答を保証する必要があるのですか? なぜリアルタイムシステムが決定論的応答を保証する必要があるのですか? Sep 22, 2025 pm 04:03 PM

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

See all articles