CodeGym /Java Course /モジュール 2: Java コア /ジェネリックス: スーパー、拡張、リスト

ジェネリックス: スーパー、拡張、リスト

モジュール 2: Java コア
レベル 5 , レッスン 1
使用可能

「それでは、新しい興味深いトピック、ワイルドカードについて説明します。」

「本質的に、これは何にでも一致する «*» パターンのようなものです。」

「でも、最初から始めましょう。」

「ウォリアー クラスと、2 人のウォリアーのうちどちらが強いかを決定するメソッドがあると想像してください。これは次のようになります。」

例1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }
}
メソッド呼び出しの例
MagicWarrior mag = new MagicWarrior();
ArcherWarrior archer = new ArcherWarrior();

boolean isMagicCooler = WarriorManager.fight(mag, archer);

「マジックウォリアーとアーチャーウォリアーは両方ともウォリアーを継承します。

「少し単純化されていますが、例としてはこれで十分です。」

"OK。"

「次に、複数の戦士が戦いに参加している状況に対して、同様の方法を作成することにしたとします。」

例1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<Warrior> w1, List<Warrior> w2)
 {
  return 
 }
}
メソッド呼び出しの例
ArrayList<MagicWarrior> magi = new ArrayList<MagicWarrior>();
for(int i = 0; i < 10; i++)
 magi.add(new MagicWarrior());

ArrayList<ArcherWarrior> archers = new ArrayList<ArcherWarrior>();
for(int i = 0; i < 10; i++)
 archers.add(new ArcherWarrior());

boolean isMagicCooler = WarriorManager.fight(magi, archers); // Compilation error!

「しかし、ここでコンパイルエラーが発生し、何が間違っているのか困惑しています。」

「問題は、MagicWarrior が Warrior を継承し、MagicWarrior オブジェクトをfight(Warrior, Warrior) メソッドに渡すことができるということです。」

「しかし、List<MagicWarrior> は List<Warrior> を継承しません。したがって、そこに渡すことはできません。」

「継承しないってどういうこと?」

「つまり、1 つはリストで、もう 1 つはリストですが、型パラメーターがあります。」

「その通りです。どういうわけかすぐには気づきませんでした。それで、この問題にはすでに解決策があるのでしょうか?」

「はい。もっと複雑な構造を使用する必要があります。次のようになります。」

例1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<? extends Warrior> w1, List<? extends Warrior> w2)
 {
  return …
 }
}

「«? ウォリアーを拡張する」の部分は、「ウォリアーを継承する任意のタイプ」を意味します。

「言い換えれば、List<MagicWarrior> と List<ArcherWarrior> を渡すことができるようになり、すべてが機能するようになります。」

「それは本当に素晴らしいことです。そのような問題は少なければ少ないほど良いのです。」

「私もそう感じます。」

「しかし、Warrior を継承するものが必要ない場合はどうすればよいでしょうか? 任意の型パラメータを持つ任意の List をメソッドに渡したい場合はどうすればよいでしょうか? それは許可されていますか?」

「はい、それを行うには 2 つの表記形式があります。」

List<? extends Object>
List<?>

「どちらも同じ意味なので、通常は 2 番目のバージョンが使用されます。」

"それが今日のすべてです。"

「ありがとう、エリー。今日は本当にたくさんのことを学びました。」

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION