• ベストアンサー

JAVAのジェネリクスについて

添付画像の問題の答えがどうしてもわかりません。。 選択肢は以下です。 (1)public void addData(List<? super BBB> list) { (2)public void addData(List<? extends BBB> list) { (3)public void addData(List list) { (4)public void addData(List<BBB> list) { 正解は「(1)、(4)」なのですが、 (2)も正解のように思っています。 わかる方、いらっしゃいましたらご教授頂けますと幸いです。。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

選択肢の(2)がなぜダメなのか。まず、<?>はBBBから派生するが、それは「誰に対して提供される情報」なのかという事を考えてみよう。それは「addData(List<? extends BBB>)を呼ぶ人に対して提供される情報」だ。 つまり、addData(List<? extends BBB> list)の内部では、仮引数listは「BBB型から派生するあらゆる型のリスト」なのだ。なので、仮にBBBから派生したDDDなるクラスがあったとして、addData(new ArrayList<DDD>())という風に呼び出されたら、addDataの中でこの仮引数listにaddされるのはDDDのインスタンスじゃないといけない。list<DDD>.add()はnew BBB()を引数として受け付けない。以下にそれを検証したコードを掲載するので確認して欲しい。 ~~~~ここから~~~~ import java.util.*; class AAA {} class BBB extends AAA {} class DDD extends BBB {} public class GenericTest { public void addData(List<? extends BBB> list) { list.add(new BBB()); // ←(2)コンパイルエラー。下記の(1)よりここにたどり着いたlistが指すインスタンスはDDDに対応できなくてはいけないのでBBBではダメ。 } public void okwaveTest() { addData(new ArrayList<DDD>()); // ←(1)addDataの仮引数はBBBまたはその派生なので実引数として「BBBから派生したDDD型を受け取れるリスト」を用意。仮にnew ArrayList<BBB>()を引数にしても結果は変わらない。 } } ~~~~ここまで~~~~

関連するQ&A

  • Java コレクション・ジェネリクスについて

    Javaのコレクション・ジェネリクスについてです。 以下のコードについて、私はa.y();でAインタフェイスにyメソッドがないため コンパイルエラーになるのではないかと思っているのですが(実際にエラーが出ている) 書籍では「実行されるがなにも表示されない」とあります。 もし私の考え方に間違いがあればご指摘いただけると幸いです。 ocj-pを受験目前なので切実です。 よろしくお願いいたします。 interface A { void x(); } class B implements A { public void x(){} public void y(){} } class C extends B public void x(){} } public class D { public static void main(String[] args) { List<A> list = new ArrayList<A>(); list.add(new B()); list.add(new C()); for(A a : list) { a.x(); a.y(); } } }

    • ベストアンサー
    • Java
  • log, e^x の問題の解き方を教えてください。

    いつも大変お世話になっております。 以下の4題の問題の解き方をご教授頂けると幸いです。 (1)9^x-1=3^1+x 私の答えはx=2だったのですが、 正解はx=3だそうです。 (2)2x^2e^x=3xe^x 私の答えはx=3/2で、正解と合っているのですが、 正解にはx=3/2、0 と”0”がありました。 これは0を代入すると式の左右が0になるから、という考え方でよろしいでしょうか。 (3)log1/3(←小さい3分の1)9=x 私の答えはx=27なのですが、 正解はx=-2なのだそうです。 logx(←小さいx)8=-3 私の答えはx=-2なのですが、 正解はx=1/2だそうです。 上記が見づらかったら、 後ほど画像を添付させて頂こうと思っています。 お手数をおかけ致しますが、 どうぞよろしくお願い致します。

  • javaの質問です。

    明日JavaのBronze試験を受けに行くのですが、全然わからずに困っています。 紫色のJavaプログラマBronzr[SE7]という本を使用しています。 本の模試の問題です。 37 Class Super{ static void method(){ System.out.println("Super"); } } Class Sub extends Super{ static void method(){ System.out.println("Sub"); } } Class Test { public static void main(String[] args){ Super obj = new Sub(); obj.method(); } } この問題はSuperが表示されるらしいのですが、理由がわかりません。 サブクラスをインスタンス化しているので、Subが表示されるというのなら理解できます。staticが関係あるのはなんとなくわかるのですが、、、、、、なぜSuperなのかがわかりません。 解答ではスーパークラスの型にサブクラスを入れているからと簡単に書いてあります。 詳しく説明していただけると助かります。

    • ベストアンサー
    • Java
  • java repaint()に関して

    プログラムで以下のpaintComponents内のデバックができません。 理由は一体何なのでしょうか? お願いします。 import java.awt.Graphics; import javax.swing.JPanel; public class MainPanel extends JPanel implements Runnable { Thread th; public MainPanel() { super(); } public void movestart() { th = new Thread(this); th.start(); } public void paintComponent(Graphics g) { System.out.println("このデバックができない"); super.paintComponent(g); } public void run() { while (true) { System.out.println("ここのデバックはできている"); repaint(); try { th.sleep(100); } catch (Exception e) { } } } }

    • ベストアンサー
    • Java
  • JavaでのポリモーフィズムをC#で表現するには?

    最近ふと気になったのですが、以下のJavaのコードと等価なコードは、C#ではどのように書けばよいのでしょうか? --- public Class1 {   public void foo() {     System.out.println("Class1");   } } public Class2 extends Class1 {   public void foo() {     System.out.println("Class2");     super.foo();   } } public Class3 extends Class2 {   public void foo() {     System.out.println("Class3");     super.foo();   } } --- 気分的には次のように書きたいところなのですが、このように書くとコンパイルエラーになってしまいます。 --- public class Class1 {   public virtual void foo() {     Console.WriteLine("Class1");   } } public class Class2 : Class1 {   public virtual override void foo() {     Console.WriteLine("Class2");     base.foo();   } } public class Class3 : Class2 {   public override void foo() {     Console.WriteLine("Class3");     base.foo();   } } --- 調べた限り、ストレートな方法で記述することは不可能だと感じたのですが、やはりそうなのでしょうか? そうだとしたら、現実にこのように記述する必要が生じた場合には、どのように対処すればよいのでしょうか? また、C#の言語仕様はなぜこのようになっているのでしょうか?(VMの仕組みも関係あるのでしょうか?) 知っていらっしゃる方がいましたら、教えていただけると助かります。

  • JAVAの正解・誤解判定の宣言が分かりません

    class ListPanel extends JPanel implements ActionListener{ JButton button1; JList list1; String[] data = {"( A )","( B )" ,"( C )" ,"( D )" }; ListPanel() { button1 = new JButton("選択OK"); button1.addActionListener(this); list1 = new JList(data); list1.setFixedCellWidth(100); JScrollPane scroll1 = new JScrollPane(list1); scroll1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scroll1.setPreferredSize(new Dimension(150,80)); scroll1.setBorder(BorderFactory.createEtchedBorder() ); scroll1.setBorder(BorderFactory.createTitledBorder("選択肢") ); JPanel p1 = new JPanel(); p1.add(scroll1); JPanel p2 = new JPanel(); p2.add(button1); this.add(p1); this.add(p2); } public void actionPerformed(ActionEvent e1) { if (e1.getSource() == button1) { if (list1.getSelectedItem() == ( C ) ) { JOptionPane.showMessageDialog(null, "あなたが選択した解答" , " 正解です!",JOptionPane.INFORMATION_MESSAGE); } else if (list1.getSelectedItem() != ( C ) ){ JOptionPane.showMessageDialog(null, "あなたが選択した解答", "間違いです!解答は( C )です" , JOptionPane.INFORMATION_MESSAGE); list1.getSelectedItem() == ( C ) ) { の宣言が間違っているようです。何卒よろしくお願いいたします。どこが間違っているか指摘していただければ幸いです。どうか、よろしくお願いします。

  • 八つの整数を使った問題

    以下の異なる八つの整数をそれぞれ1回ずつ使って,図(添付画像)のように縦横の合計がすべて同じようになるようにするには,どの数字をどこに配置したらよいかという問題です。 -6,-4,-3,-1,1,2,3,5 この問題は中1の生徒の「数学パズル」というテキストに出ていたのですが中学で習う数学の内容で解けるものなのでしょうか?正解,あるいは解法をご教授いただければ幸いです。

  • Vectorと配列

    お世話になります。 GUIから3つのString文字列を受け取り、追加ボタンを押した時点でVector(List)に格納し、登録ボタンを押してはじめてDBにデータを格納させたいのですが、 Vector list = new Vector(); String addData[] = {txta.getText(), txtb.getText(), txtc.getText()}; for(int i=0; i<addData.length; i++){ list.addElement(addData[i]); } しかし、連続してデータを追加するとlistには {data1,data2,data3,data4,data5,data6} のように入ってしまいます。 これを {data1,data2,data3} {data4,data5,data6} のようにlistに格納するにはどうすればいいでしょうか? ご教授頂ければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのrepaint()について

    Java初心者です。 現在、アニメーションで少々つまずいています・・・ソースは以下の通りです。 import java.awt.*; import java.awt.event.*; public class test04 extends Frame implements KeyListener { public int x = 10, y = 10; public static void main(String[] args) { new test04(); } test04() { super("KeyFrameTest"); //フレーム名 setSize(200, 200); //フレームサイズを設定 MyCanvas mc = new MyCanvas(); mc.addKeyListener(this); add(mc); setVisible(true); //フレームを表示 addWindowListener(new Close()); //クローズ処理 } /*** キーが押されているとき ***/ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case 37: //← x--; break; case 38: //↑ y--; break; case 39: //→ x++; break; case 40: //↓ y++; break; } System.out.println("(" + x + "," + y + ")"); } /*** キーが離されたとき ***/ public void keyReleased(KeyEvent e) { } /*** キーが押された瞬間 ***/ public void keyTyped(KeyEvent e) { } /*** キャンバス用クラス ***/ class MyCanvas extends Canvas { /*** 描画ステータス ***/ public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(x, y, 20, 20); repaint(); } /*** ペイント処理 ***/ //勝手に点滅するのを回避するため public void update(Graphics g) { paint(g); } } } /*** クローズクラス ***/ class Close extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } /*** スリープクラス ***/ class Sleep extends Thread { public void Sleep(long milli) { try { Thread.sleep(milli); } catch(Exception e) { } } } ↑のプログラムを実行すると、押したキーに対応する動作はするのですが、 前に描画した残像が残ってしまい、上手くいきません・・・repaint()の位置を変えてみたり したら、今度はボックスが動かなくなってしまい、訳が分からなくなって来ました・・・何故 上手くいかないんでしょうか? 理想的な動作としては、押したキーに対応した動作をし、残像も残らないようにしたいです。 ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • JAVAのプリファレンスがうまくいかず困っています

    独学で勉強初めてまだ一ヶ月程度なのですがプリファレンスの扱いがうまくいかず困っています。 とりあえずアンドロイドアプリのシューティングゲームを作りながら判らなかったら調べつつ進めているので、根本的に間違っているかもですが御教授頂ければと思います。 ゲームのステータスをいじる画面をviewクラスで作り保存できるようにと思ったのですが、アクティビティでしかプリファレンスを扱えず無理やりやろうとしてこうなってしまいました。 ------------------------- public class SettingActivity extends Activity { int speed; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); //プリファレンスの準備 speed = pref.getInt("speed",1); //呼び出し 第二引数は初期値 LinearLayout l = new LinearLayout(this); l.setOrientation(LinearLayout.VERTICAL); setContentView(l); l.addView(new Setting(this)); } @Override protected void onPause() { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); //プリファレンスの準備 Setting set = new Setting(this); Editor date = pref.edit(); date.putInt("speed",set.getSpeed()); date.commit(); //保存 super.onPause(); } -------------------------------- public class Setting extends View { SettingActivity activity = (SettingActivity)this.getContext(); int speed = activity.speed; void setSpeed(int sp) { speed = sp; } int getSpeed() { return speed; } public void onDraw(Canvas c) { super.onDraw(c); if(画面の表示が変わったとき) speed = 表示の値に; setSpeed(speed); } ----------------------------- 色々調べた結果このような感じになったのですが、どうしても最初の画面に戻ったら元に戻ってしまいます。 どのようにすればうまくいきますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java