みなさん、こんにちは。今日はPECSの原則についてお話したいと思います。「JavaGenericsは2004年9月30日にリリースされたJDK1.5に登場しました...」という理由で、プログラミングの達人と経験豊富な先輩が再び顔を押し付けたと理解しています。しかし、PECSの原則が曖昧で理解できないままであり、持続的なグーグルが「霧」を濃くするだけの人がいる場合は、猫へようこそ。完全な精神的悟りまで一緒に整理します。この記事ではジェネリックとは何か、ワイルドカードとは何かについては説明していません。これらの概念に精通していない場合は、読む前にそれらを理解する必要があります。
一見すると、PECSの原則は非常に単純なようです。彼に会ったことのある人なら誰でも、これがProducer Extends ConsumerSuperの頭字語であることを知っています。多くの記事で説明されているように、上限(extends)を持つワイルドカードで入力されたコレクションがある場合、これは「プロデューサー」です。 「それは「生成する」だけで、コンテナから要素を提供し、それ自体では何も受け取りません。」下限(super)にワイルドカードで入力されたコレクションがある場合、これは「受け入れるだけで何も提供できない」「消費者」です。
まあ、それは実際にはすべてです。これで、PECSの「黒魔術」を習得し、Googleのインタビューに安全にアクセスして、インタビュアーに私たちの知恵と経験を印象付けることができます。お気に入りのIDEを起動し、すべてがshowの場合であることを確認するために、残りの小さな形式は1つだけです。上部の境界線で囲まれたコンテナーはオブジェクトのみを提供でき、下部の境界線で制限されたコンテナーはコンシューマーのみです。
わかりやすくするために、Class1の祖先であるClass0、次にClass2の祖先で始まるクラス階層があるとします。そして、引数として上限を持つワイルドカードタイプのコレクションをとるメソッドがあります。
someMethod (List<? extends Class3> list)
PECSの原則によれば、このシートには何も入れることはできず、データプロバイダーのみになります。
List<? extends Class3> list
?
: , list, Class3, , list Class4, Class5, Class6 .. , – « »! :
public static void someMethod (List<? extends Class3> list) {
Class4 class4 = list.get(0);
}
:
public static void someMethod (List<? extends Class3> list) {
Class2 class2 = list.get(0);
}
: .
? ? - , , -. , . , . , Class3.
Class4 class4 = list.get(0);
- , -, Java . , , , , .
Class4 class4 = (Class4) list.get(0);
. ? ?
List<? extends Class3> list
(Class0, Class1, Class2), , : - -. List<Integer> list
, Number,
. , List<? extends Class3> list
Class4 Class5? ! JVM , List<? extends Class3>
. List<Class4>
, List<Class100500>
. List<Class100500>
, , Class3 Class4, , Number
List<Integer>
. , , List<? extends Class3>
Class3, - Class3, , , Class3.
PECS – «consumer super» («wildcard super — consumer, , »).
: wildcard super , wildcard extend – ? . List<? extends Class3>
- «» , List<? super Class3>
, «» Class3. ,
public static void someMethod (List<? super Class3> list) {
list.add(new Class4());
}
, :
public static void someMethod (List<? super Class3> list) {
list.add(new Class2());
}
, :
public static void someMethod (List<Integer> list) {
list.add(new Number());
}
, , «wildcard super — consumer » - . , , , «consumer super…»
public static void someMethod (List<? super Class3> list) {
list.get(0);
}
, -…
IDE, : , super, consumer! , , list.get(0)
. ? , Class3? ! , Class2 ( - super). ! Class4? . get()
, - ? «» Java - Object.
, PECS: , wildecard , Object?
, , , , , . , wildcard , , -, -.
«» ( Class2 Class3)
public static void someMethod (List<? super Class3> list) {
Class2 obj = list.get(0);
}
: List<Class1>
List<Object>
( <? super Class3>
) - (Class2 obj) (list.get(0)
). – , , Java, Object.
PECSの原則についてお話ししたいのはこれだけです。私の説明が明確になり、真実に苦しむ人々がこの問題を理解するのに役立つことを願っています。