Javaのインターフェイスとジェネリクスに関する質問

このQ&Aのポイント
  • Javaのインターフェイスやジェネリクスの記述方法についての質問です。
  • インターフェイスのextendsやジェネリクスの記述について具体的な例を挙げながら質問しています。
  • また、RepositoryやEntityの関係性についても疑問があります。
回答を見る
  • ベストアンサー

Javaの記述について

Javaの書き方で雑誌に載っていたもので、2点ほど質問があります。 Javaに詳しい方、ご回答お願い致します。 (1)下記の3つのインターフェイスですが、extends Repositoryと書いた場合、Repositoryをinterface で定義したり、extends Entityと書いた場合に、Entityをinterfaceで定義できる場合はどのような時なのでしょうか?通常はここはclassかabstract classになると思うのですが。 (2)ジェネリクスの書き方で、Repository<T extends Entity<T, ID>, ID> という部分がありますが、これはRepository<T, ID>ではだめなのでしょうか?RepositoryのTはEntityのTを継承しているという意味でこのように書いているのでしょうか?また、この場合RepositoryのIDはEntityのIDとは何も関係ないと思っていいのでしょうか? package schemagenerator.domain.repository; import schemagenerator.domain.model.DataSource; /** * {@link DataSource}のためのリポジトリ。 * <p> * プロパティファイル上のデータソースを読み書きできるリポジトリ。 * </p> * */ public interface DataSourceRespository extends Repository<DataSource, String> { } package schemagenerator.domain.repository; import java.util.Collection; import java.util.UUID; import schemagenerator.domain.model.Entity; /** * リポジトリを表すインターフェイス。 * * <p> * {@link Entity}に対するリポジトリの責務を表すインターフェイス。 * </p> * * @param <T> {@link Entity エンティティ}の型 * @param <ID> {@link Entity エンティティ}のIDの型 * */ public interface Repository<T extends Entity<T, ID>, ID> { /** * すべての{@link Entity エンティティ}を返す。 * * @return すべての{@link Entity エンティティ} */ Collection<T> findAll(); /** * {@link Entity エンティティ}を識別子で検索する。 * * @param id {@link UUID} * @return {@link Entity エンティティ} */ T findById(ID id); /** * {@link Entity エンティティ}を保存する。 * * @param entity {@link Entity エンティティ} */ void store(T entity); } package schemagenerator.domain.model; /** * エンティティを表すインターフェイス。 * * @param <T> エンティティの型 * @param <ID> 識別子 * * @version $Id$ */ public interface Entity<T extends Entity<T, ID>, ID> { /** * 識別子を取得する。 * * @return 識別子 */ ID getIdentity(); /** * 指定されたエンティティとこのエンティティが同じ識別子かどうかを判定する。 * * <p>{@link #equals(Object)}と違って、ジェネリックスで安全に等価を判定する場合に利用する</p> * * @param other エンティティ * @return 同じ識別子ならtrue */ boolean sameIdentityAs(T other); }

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

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

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

>(1)下記の3つのインターフェイスですが、extends Repositoryと書いた場合~ このインターフェースはDataSouceとStringの型に関連があることを表現しています。 逆に言うと関連があることを示すために、こんな回りくどいことをしているのだと思います。 >(2)ジェネリクスの書き方で、Repository<T extends Entity<T, ID>, ID> という部分がありますが、これはRepository<T, ID>ではだめなのでしょうか? それでもいいです。これは次の >RepositoryのTはEntityのTを継承しているという意味でこのように書いているのでしょうか? を表現するために、T extends Entity~と記載しています。 (1)と(2)の要旨はプログラム上で表現するか、設計書上に記載するかの違いでしょう。 >また、この場合RepositoryのIDはEntityのIDとは何も関係ないと思っていいのでしょうか? 関係はあります。RepositoryにIDを渡すと一意なEntityを返す必要があります。

参考URL:
http://d.hatena.ne.jp/j5ik2o/20101229/1293642673

関連するQ&A

  • java通信について

    アプレットビューアは 通信成功できますが HTMLから実行すると失敗します so = new Socket( "localhost", 80 ); この部分が失敗してるようです なぜ起こるんでしょうか ? 解決方法を教えてください。 //html <html><body> <applet code = "a.class" width = "370" height ="530"></applet> </body></html>   //<applet code = "a.class" width="400" height = "200"></applet> import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class a extends java.applet.Applet implements ActionListener{ TextField tf; Button b; TextArea t; Panel p, p1; String str = "http://localhost/cgi-bin/a.cgi"; public void init(){ tf = new TextField( 32 ); b = new Button( "Post" ); t = new TextArea( 20, 48 ); b.addActionListener( this ); p = new Panel(); p.add( new Label( "String" ) ); p.add( tf ); p.add( b ); p1 = new Panel(); p1.add( t ); add( p ); add( p1 ); } public void actionPerformed( ActionEvent e ){ String str; if( e.getSource() == b ){ t.setText( sen( tf.getText() ) ); } } private String sen( String a ){   Socket so = null; InputStreamReader in = null; OutputStream os = null; String str1 = new String(); try { t.setText( "aa" ); so = new Socket( "localhost", 80 ); t.setText( "bb" ); in = new InputStreamReader( so.getInputStream() ); os = so.getOutputStream(); }catch( Exception e ){ return "Error!"; } String H = "POST " + str + " HTTP/1.0\n"; H += "Content-Length:" + String.valueOf( a.length() ) + "\n\n"; String st = new String( H + a ); try{ os.write( st.getBytes() ); }catch( Exception e ){ return "Error!"; } str1 = "Send:\n" + st; boolean bo = true; StringBuffer sb = new StringBuffer(); int s; while( bo ){ try{ s = in.read();   if( s == -1 ) bo = false; else sb.append( (char)s ); }catch( Exception e ){ bo = false; } } str1 += "\nResv:\n" + sb.toString(); return str1; } }

    • ベストアンサー
    • Java
  • javaのインターフェースと動的制御について教えてください!

    javaのインタフェースと動的制御についての課題を出されたのですが、以下のようなものです ・起動させるクラス名はmain実行時にコマンドライン引数として渡す ・動的に呼び出されるクラスは2つ作成し、クラスその(1)現在の時間、 クラスその(2)クラス名を出力させる。 ・想定している構成として、メインクラス、インターフェース、動的ク ラス二つの計4クラスとする。 という問題で今のところ作成したクラスが以下のようなものです、インターフェースクラスと動的クラス二つはなんとかできて、このまま変化させずに置きたいです。メインクラスの見当がつきません、できたらメインクラスのアドバイスをどうかお願いします。ちなみに私はエクリプスをしようしています。 インターフェースクラス package Kadai1221; public interface Interface001 { void kurasu(); } 動的クラス二つ 一つめ package Kadai1221; import java.util.Calendar; public class Jikan implements Interface001 { public void kurasu() { Calendar now = Calendar.getInstance(); int zikan; int hun; int byou; zikan = now.get(Calendar.HOUR_OF_DAY); hun = now.get(Calendar.MINUTE); byou = now.get(Calendar.SECOND); System.out.println(zikan + "時" + hun + "分"          + byou + "秒"); } } 二つ目 package Kadai1221; public class Kurasumei implements Interface001 { public void kurasu() { System.out.println("Kurasumei"); } } メインクラス package Kadai1221; public class Kadaimain { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ } } どうかよろしくお願いします。

  • 肥大化した実装クラスを分割する方法は?

    お世話になります。 javaで開発を行っているのですが、クラスファイルのソースが肥大化したので行数を減らすべくクラス分割を行いたいと考えています。(CheckStyleの定義で規定行数を超えたため) 現在、あるサービスクラスがあり、実装クラス側分割の方法としてexportとimportそれぞれ分割したいのですが、具体的な方法がわかりません。 現在の実装を下記に書いてみます。 ※jdk1.5.0_09を使用しています //インターフェース public interface HogeService {   void export(Integer param1, Integer param2);   void import(Integer param1, Integer param2); } //実装クラス public final class HogeServiceImpl implements HogeService {   //export implement   public void export(Integer param1, Integer param2) {     実装   }   //export sub method   private void exportSubMethod1() {     実装   }   //import implement   public void import(Integer param1, Integer param2) {     実装   }   //import sub method   private void importSubMethod1() {     実装   } } importとexportには共通するメソッドはなく、単純に2つのクラスにソース分割できればと考えております。

    • ベストアンサー
    • Java
  • Javaのエラーの箇所

    (絶っっ対、無理)。 そんな無茶な教授から宿題が出ました。 しかも大急ぎです(後二時間しかない…)。 どうかどこにどんなエラーが出るのか教えて下さい。 For the declaration of I1: interface I1{ int I1f1(); void I1f2(int i); } identify the errors. (a) in the declaration of the interface I2: interface I2 extends I1{ double I2f1(); void I2f2(); int I1f1(); double I2f1(){return 10;} private int AC1f4(); private int n=10; } (b) in the declaration of class CI1: class CI1 implements I1{ int I1f1(){.....} void I1f2(int i){.....} int CI1f3(){.....} } (c) and in the declaration of object c6: I1 c6 = new I1(); 勘ですが、(a)はinterface I1がpublicと宣言されてないので (a)の中の int I1f1(); が呼べないのでしょうか? (b)と(c)はまったく分かりません。

    • ベストアンサー
    • Java
  • Javaプログラミング

    こんにちは。Javaを最近勉強し始めたJava初心者です。これは2つの数を入力してそれそれの和、差、積、剰余を表示するものです(入力時の妥当性チェックは考慮しない。)。しかし下記のプログラムがうまく動いてくれません。どこが間違っているのかわからないのでわかる方教えて下さい。おねがいします。 import java.io.*; interface plus { int Plus(); } interface sub { int Sub(); } interface mul { int mul(); } interface mod { int Mod(); } class Compute extends plus,sub,mul,mod { int pa,pb; Compute(int a,int b) { this.pa=a; pb=b; } public int Plus() { return(pa+pb); //和を返す } public int Sub() //差を返す { return(pa-pb); } public int Mul() { return(pa*pb); //積を返す } public int Mod() { return(pa%pb); //余を返す } } class calc { public static void main(String args[]) throws IOException { InputStreamReader isp=new InputStreamReader(System.stdin); BufferedReader inp=new BufferedReader(isp); System.out.print("数1="); String sLins=inp.readLine(); //1つめの数値を入力 int a=integer.parseInt(sLine); System.out.print("数2="); String sLins=inp.readLine(); //2つめの数値を入力 int b=integer.parseInt(sLine); Compute c=new Compute(a,b); System.out.println("和:"+c.Plus()+"差:"+c.Sub()+"積:"+c.Mul()+"余:"+c.Mod()); } }

    • ベストアンサー
    • Java
  • Java 他クラスの呼び出しが上手くいきません。

    Java初心者です。 過去Q&Aとして掲載されていた「iアプリでのクラスファイルが複数ある時の画面遷移」と同趣旨のことがしたく、記事を参考にプログラムを組んでみました。 しかし、コンパイルの際、画面遷移のための別クラスファイルを呼び出しインスタンス化するところで生じる「シンボルを見つけられません。」というエラーの原因がつかめず困っています。 作成したプログラムのどこがいけないのか、ご教示いただければ幸いです。 作成したプログラム ========= Test01.java ========= import com.nttdocomo.ui.*; public class Test01 extends IApplication implements ComponentListener{ Button btn1; Label lbl1; public void start() { Panel p1 = new Panel(); p1.setTitle("p1"); Label lbl1=new Label("p1に居ます。"); p1.add(lbl1); Button btn1=new Button("next"); p1.add(btn1); p1.setComponentListener(this); Display.setCurrent(p1); } public void componentAction(Component source, int type, int param) { if(type == ComponentListener.BUTTON_PRESSED) { if(source==btn1){ Test02 test02 =new Test02(); //ここでエラーが発生します。 Display.setCurrent(test02); lbl1.setText("p2に遷移"); } } } } ============ Test02.java ============ import com.nttdocomo.ui.*; public class Test02 extends IApplication implements ComponentListener{ Button btn1; Label lbl1; public void start() { Panel p2 = new Panel(); p2.setTitle("p2"); Label lbl1=new Label("p2に居ます。"); p2.add(lbl1); Button btn1=new Button("next"); p2.add(btn1); p2.setComponentListener(this); Display.setCurrent(p2); } public void componentAction(Component source, int type, int param) { if(type == ComponentListener.BUTTON_PRESSED) { if(source==btn1){ lbl1.setText("p1に遷移"); //コンパイルエラーは生じませんが、ラベル表示の切り替えができません。 } } } }

    • ベストアンサー
    • Java
  • java

    Base64にエンコードしたものをデコードするプログラムです。(汎用性が低いのは仕様です)コンパイルは通ったのですが、実行したら以下のエラーが出てきました。 C:\Users\Owner\Documents\javadev>java Base64Decode2 hello.dat hello2.txt java.lang.ArrayIndexOutOfBoundsException: 97 at Base64Decode2.decode(Base64Decode2.java:51) at Base64Decode2.main(Base64Decode2.java:23) 指定の行を見ても原因がよく分かりません。とても初歩的な質問なのかもしれませんが、お願いします。 以下がプログラムコードです import java.io.*; public class Base64Decode2 { public static void main(String[] args) { // 変換テーブル char[] table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; InputStream in = null; // 入力データ OutputStream out = null; // 出力先 try { in = new FileInputStream(args[0]); out = new FileOutputStream(args[1]); char[] cs; while ((cs=read4(in)) != null) { int[] buf = decode(cs, table);//ここが問題? for (int i=0; i<buf.length; i++) { System.out.print(buf[i]+", "); } System.out.println(); int[] buf2 = convert6to8(buf); write3(out, buf2); } } catch (Exception e) { e.printStackTrace(); // 例外の情報を表示する } finally { // in, out を閉じる try { in.close(); out.close(); } catch (Exception e) { } } } /** * 8ビットの2進数の列を復号化する. * @param cs * @param table 符号テーブル * @return */ public static int[] decode(char[] cs, char[] table) { int[] buf = new int[cs.length]; for (int i=0; i<buf.length; i++) { buf[i] = table[cs[i]];//ここが問題? } return buf; } public static int[] convert6to8(int[] buf) { String b; int[] buf2; if (buf.length == 2) { b = toBinary(buf[0], 6); buf2 = new int[1]; buf2[0] = fromBinary(b.substring(0, 8)); } else if (buf.length == 3) { b = toBinary(buf[0], 6) + toBinary(buf[1], 6); buf2 = new int[2]; buf2[0] = fromBinary(b.substring(0, 8)); buf2[1] = fromBinary(b.substring(8, 16)); } else { b = toBinary(buf[0], 6) + toBinary(buf[1], 6) + toBinary(buf[2], 6); buf2 = new int[3]; buf2[0] = fromBinary(b.substring(0, 8)); buf2[1] = fromBinary(b.substring(8, 16)); buf2[2] = fromBinary(b.substring(16, 24)); } return buf2; } /** * バイト列 bt の数を順に出力する. * @param bt 数の配列。長さは 3以下. 各数は8ビットの整数 */ public static void write3(OutputStream out, int[] bt) throws IOException { for (int i=0; i<3; i++) { if (i<bt.length) { out.write(bt[i]); } } } /** * in から文字を最大4つ読み出す. * @param in 入力ストリーム * @return 文字の配列。配列長は最大4. 入力終了したときには null を返す. */ public static char[] read4(InputStream in) throws IOException { char[] bs; int n0=in.read(); int n1=in.read(); int n2=in.read(); int n3=in.read(); if (n0 < 0) { // 読み込み終了 bs = null; } else if (n2 < 0 || (char) n2=='=') { bs = new char[2]; bs[0] = (char) n0; bs[1] = (char) n1; } else if (n3 < 0 || (char) n3=='=') { bs = new char[3]; bs[0] = (char) n0; bs[1] = (char) n1; bs[2] = (char) n2; } else { bs = new char[4]; bs[0] = (char) n0; bs[1] = (char) n1; bs[2] = (char) n2; bs[3] = (char) n3; } return bs; } /** * 数を読み取って、nビットの2進数を表す文字列に変換する * @param bt 1バイトの数 * @param n 2進数のビット数 * @return 2進数を表す文字列 */ public static String toBinary(int bt, int n) { String s = Integer.toBinaryString(bt); for (int i=s.length(); i<n; i++) { s = "0" + s; } return s; } /** * 2進数を表す文字列を数に変換する * @param b 2進数を表す文字列 * @return b が表す数 */ public static int fromBinary(String b) { return Integer.parseInt(b, 2); } }

    • ベストアンサー
    • Java
  • javaプログラムについて

    javaのプログラムで入力項目をDBに書き込むというプログラムを作成しているのですが、 コンソール形式だと成功するのですが、テキストボックスなどをおいて、GUI形式でやろうとするとキーイベントの中の変数ににうまく値が参照されません 以下ソース import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import java.awt.Container; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; class meibo3 extends JFrame implements KeyListener { public static void main(String args[]) { meibo3 frame = new meibo3("タイトル"); frame.setVisible(true); } // private String name; // private String shu; // private int id; // private int su; meibo3(String title) { setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setLayout(null); JLabel lmeibo = new JLabel("【名簿入力】", SwingConstants.CENTER); lmeibo.setBounds(100, 10, 80, 30); JLabel lgakuno = new JLabel("学生番号", SwingConstants.CENTER); lgakuno.setBounds(30, 40, 80, 30); JLabel lname = new JLabel("氏 名", SwingConstants.CENTER); lname.setBounds(200, 40, 80, 30); JLabel lshu = new JLabel("入力を終了しますか?(Y/N)"); lshu.setBounds(30, 120, 200, 30); JTextField gaku = new JTextField(4); gaku.setBounds(30, 70, 80, 30); JTextField namae = new JTextField(20); namae.setBounds(200, 70, 80, 30); JTextField y = new JTextField(20); y.setBounds(200, 120, 20, 30); y.addKeyListener(this); ; p.add(lmeibo); p.add(lgakuno); p.add(lname); p.add(gaku); p.add(namae); p.add(y); p.add(lshu); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); int id = Integer.valueOf(gaku.getText()).intValue(); String name = namae.getText(); int nsu = namae.getText().length(); String yn =y.getText(); //method(id,name,nsu,yn); } public void keyPressed(KeyEvent ke) { // TODO 自動生成されたメソッド・スタブ if (ke.getKeyCode() == ke.VK_ENTER) { //private void method(int id, String name, int nsu, String yn){ Date d = new Date(); SimpleDateFormat dfd = new SimpleDateFormat("yyyy-MM-dd"); Connection con = null; String day = dfd.format(d); // System.out.print(day); PreparedStatement ps = null; try { // ドライバクラスをロード Class.forName("com.mysql.jdbc.Driver"); // データベースへ接続 con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/hellodb", "root", "root"); Statement stmt = (Statement) con.createStatement(); // name,bloodType,ageのデータを検索するSQL文を作成 String sql = "INSERT INTO hellodb.meibo VALUES(" + id + ",'" + name + "','" + day + "');"; System.out.println(sql); if (id > 4 && nsu > 20) { // JOptionPane.showMessageDialog(this, "学生番号が4桁以上、氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (id < 5) { // JOptionPane.showMessageDialog(this, // "学生番号が4桁以上になっています", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (nsu > 20) { // JOptionPane.showMessageDialog(this, // "氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (yn.equals("y") || yn.equals("y") || yn.equals("Y") || yn.equals("Y")) { // ps = con.prepareStatement(sql); stmt.execute(sql); // JOptionPane.showMessageDialog(this, // "成功しました", "Info", // JOptionPane.INFORMATION_MESSAGE); } else if (yn.equals("n") || yn.equals("n") || yn.equals("N") || yn.equals("N")) { } } } } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { // close処理 if (ps != null) { ps.close(); } // close処理 if (con != null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } public void keyReleased(KeyEvent arg0) { // TODO 自動生成されたメソッド・スタブ } public void keyTyped(KeyEvent arg0) { // TOD

  • javaのプログラミングについての質問です。

    Javaのプログラムについての質問です。長くなってしまいますがご容赦下さい。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。以下が現在までに作成したコードになります。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中にコメントを振ってあります。 import java.util.List; import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; class Mylist implements List{   private int Count;   private String Data[];   // コンストラクタ   public Mylist(){    Data = new String[10];    Count = 0;   } /** 実装するaddメソッド @return boolean APIの設定に従う @param e エレメント(要素) **/   public boolean add(E e){    Data[Count] = (String)e;   Count++;   return true;   }   public void add(int i,Object str){   }   public boolean addAll(Collection c){     return false;   }   public boolean addAll(int i,Collection c){     return false;   } /** 実装するclearメソッド **/   public void clear(){     Count = 0;   }   public boolean contains(Object str){     return false;   }   public boolean containsAll(Collection c){     return false;   }   public boolean equals(Object str){     return false;   } /** 実装するgetメソッド @return E エレメント(要素) @param i 指定されたインデックス番号 **/   public E get(int i){      /*     エレメントeに、String型Data[i]を     キャストして格納*/     E e = (E)Data[i];     return e;   }   public int hashCode(){     return -1;   }   public int indexOf(Object str){     return -1;   }   public boolean isEmpty(){     return false;   }   public Iterator iterator(){     return null;   }   public int lastIndexOf(Object str){     return -1;   }   public ListIterator listIterator(){     return null;   }   public ListIterator listIterator(int i){     return null;   }    /**   * 実装するremoveメソッド   * @return E エレメント(要素)   * @param index 指定されたインデックス番号   **/   public E remove(int index){ /* Dataを最大まで回し、iをインクリメントしたData[i++]を String型Dataに格納する*/ for(int i = index; i < Data.length; i++){ Data[i] = Data[index++]; } Count--; E e = (E)Data; return e; } public boolean remove(Object str){ return false; } public boolean removeAll(Collection c){ return false; } public boolean retainAll(Collection c){ return false; } /** * 実装するsetメソッド * @return E エレメント(要素) * @param i 指定されたインデックス番号 * @param element 置き換える要素 **/ public E set(int i,E element){ // String型Dataにelementをキャストして格納 Data[i] = (String)element; // エレメントeにData[i]をキャストして格納 E e = (E)Data[i]; // 値を返す return e; } /** * 実装するsizeメソッド * @return int 指定されたインデックス番号 **/ public int size(){ return Count; } public List subList(int i,int j){ return this; } public Object[] toArray(){ return Data; } public Object[] toArray(Object[] a){ return Data; } } class Main { /** メインメソッド **/ public static void main(String args[]) { Mylist sub = new Mylist(); /* addメソッドを実装し、機体名を要素とする。 addを最大まで回し、getメソッドで要素を取り出して表示する*/ sub.add("ビルドバーニングガンダム"); sub.add("ライトニングガンダム"); sub.add("ウイニングガンダム"); sub.add("ガンダムフェニーチェリナーシタ"); sub.add("R・ギャギャ"); sub.add("ユニコーンガンダム"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // sizeメソッド System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n"); // setメソッド sub.set(0,"ガンダムエピオン"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // 改行 System.out.println(); // removeメソッド sub.remove(1); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // clearメソッド sub.clear(); System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです"); } } コンパイルして実行すると、removeメソッドで指定した箇所ではなく、要素の1番最後が削除されています。思うに、removeメソッドを実装する所のfor(int i = index; i < Data.length; i++){の中の条件が違うと思うのですが。。。。 また、現在addには10個箱を作成するようにしていますが、11個目をメインクラス内で用意した場合、例外ではなく新たに箱を作らなければならない、という後だしジャンケン的な事を言われて、思わず「じゃあArrayListでいいじゃないか」と思ってしまいました。 気を取り直してこの3連休で終わらせたいと思っています。ここまでで現状コードの完成は50%かそれ以下だとは思いますが、どなたか上記2点について御教授頂けないでしょうか。よろしくお願い致します。

  • java の配列についての質問です。

    java の配列についての質問です。 java 及び C++についての知識は初心者です。 public abstract class Plan implements Shapeable { Shape[] shape = new Shape[5]; Shape[0] = new Rectangle(10,10,10,10); // x,y 座標 及び 長さ、高さ Shape[1] = new Triangle(10,10,30,10,20,20); // 3点間の座標        Shape[2] = new Triangle(20,10,40,10,30,20);        Shape[3] = new Triangle(15,15,35,15,25,25); Shape[4] = new Circle(20,20,20); // 円の座標と半径     public float[] calculaterAreas(){ ??????????????????? } 内容としては複雑なのですが、三角形、四角形、円の面積をShapeというclassの配列にあるデータ(座標や長さなど) を使ってShapeの配列のデータを置き換えてfloatのデータとして返すんですが・・・・。どうやっていいのかさっぱり わかりません。面積については、Rectangle,Triangle,Circleのクラスでそれぞれ計算できるようになっているのですが、それを持ってくる方法もわかりません・・・どうしたらいいのか教えてください 宜しくお願いします。 ちなみに Rectangle,Triangle,Circle class の area の メソットは --- Rectangle class public class Rectangle extends Shape{ int x; int y; int width; int height; public float area(Rectangle r) { return r.width * r.height; } --- Circle class public class Circle extends Shape{ int x; int y; int radius; public float area(Circle c) { return (float) (c.x * c.y * 3.14); } } --- Triangle class public class Triangle extends Shape{ int x; int y; int x2; int y2; int x3; int y3; public float area(Triangle t) { float dt1,dt2,dt3; float s1; float area1; dt1 = Point.distance(x, y); // Point は dt2 = Point.distance(x2, y2); dt3 = Point.distance(x3, y3); s1 = (dt1+dt2+dt3)/2; area1 = (float) Math.sqrt((s1-dt1)*(s1-dt2)*(s1-dt3)); return area1; } } *** Shape class public abstract class Shape implements Shapeable { public abstract float area(Shape obj); } *** Shapeable インターフェイス public interface Shapeable { float area (Shape obj); } ** コンストラクター等は省略してあります。

    • ベストアンサー
    • Java