共分散と反分散を理解するには、まず次のことを導入する必要があります。
リスコフ置換原理によれば、C が P のサブクラスである場合、P は C を置き換えることができます。つまり、 P p = new C();
C は P から継承し、 C
不変とは何か
F が不変の場合、 C
たとえば、リスコフ置換原則によれば、Integer は Number のサブクラスです。
Number number = new Integer(1); //correct
ただし、このように書くとエラーが報告されます
List<Number> list = new ArrayList<Integer>(1); //error
Number と Integer には Integer ListList<integer></integer>
と見なされます。継承関係はありません
共分散とは
F が共分散の場合, when C
Java は、不変性を共分散に変換するための extends を提供します。次に例を示します。 ##List<? extends Number> list = new ArrayList<Integer>(1); //corrent
このとき、
は、ArrayList<integer></integer>
Number の特定のサブクラスを表す型範囲として見ることができます配列はデフォルトで共変です
Number[] numbers = new Integer[3];
反変性とは
If F は反変です。C = F(P)Java は、不変式を共変式の Change に変換するためのスーパーを提供します。 :
List<? super Number> list = new ArrayList<Object>(1); //corrent
このとき、
は、ArrayList<object></object>
## の親クラスとみなすことができます。 #extends と super
まず、Collection.add の実装を見てみましょう:
public interface List<E> extends Collection<E> { boolean add(E e); }次のコードはエラーを報告しますか?
? extends Number は Integer 型
List<? extends Number> list = new ArrayList<Integer>(); // correct list.add(Integer.valueOf(1)); //error
と一致しません。まず、add メソッドが呼び出されるとき、汎用の
E自動的に extends Number> 2 行目はエラーを報告します。これは、
? extends Number
Integer## の親クラスではないことを意味します。 #。ここで、List extends Number>
が ArrayList<integer></integer>
の親クラスであることを区別する必要があります。 ? extends Number
は、Number の特定のサブクラスを表す、型範囲内の特定の型と見なすことができますが、それがどのサブクラスであるかは明確ではありません。Float または Short である可能性があります。 . 、または Integer のサブクラスである可能性があります (Integer は Final によって変更され、サブクラスを持つことはできません。これは単なる仮定の状況です)。上限は Number として決定されるだけで、下限は決定されません (## が存在する可能性があります)。 # ? extends Number
)、したがって
? extends Number は
Integer
の親クラスではありません上記のコードを変更します。少し変更すると正しくなります:
List<? super Number> list = new ArrayList<Object>(); // correct list.add(Integer.valueOf(1)); //correctまず第一に、反転のため、
List super Number> は ## の親クラスです。 #ArrayList<object></object>。1 行は正しいです。
2 行目: ? super Number
は Integer
の親クラスです。理由は次のとおりです:
は特定の親クラスを表しますNumber の場合、 Serializable
または Object
の場合がありますが、どちらであっても、 Number の親クラスは Integer の親クラスでなければならないため、2 行目は次のようになります。これも正しいです Use extends それともスーパーですか?
java.util.Collections (JDK1.7) の copy メソッドから答えが得られます:
public static <T> void copy(List<? super T> dest, List<? extends T> src) { int srcSize = src.size(); if (srcSize > dest.size()) throw new IndexOutOfBoundsException("Source does not fit in dest"); if (srcSize < COPY_THRESHOLD || (src instanceof RandomAccess && dest instanceof RandomAccess)) { for (int i=0; i<srcSize; i++) dest.set(i, src.get(i)); } else { ListIterator<? super T> di=dest.listIterator(); ListIterator<? extends T> si=src.listIterator(); for (int i=0; i<srcSize; i++) { di.next(); di.set(si.next()); } } }
ジェネリックから変換するには クラスがデータを取得する場合は extends; を使用します
- データをジェネリック クラスに書き込む場合は super;
- fetch と write の両方が必要です。ワイルドカードは必要ありません (つまり、extends も super も使用されません)
-
private static <E> E getFirst(List<? extends E> list){ return list.get(0); } private static <E> void setFirst(List<? super E> list, E firstElement){ list.add(firstElement); } public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); setFirst(list, 1); Number number = getFirst(list); }
以上がJava ジェネリックスの共分散、反分散、拡張および超選択メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

WebStorm Mac版
便利なJavaScript開発ツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
