0

Students クラスのメソッドにアクセスするにはどうすればよいですか。myList を印刷すると、学生クラスで toString が使用されますが、他のメソッドにアクセスする方法がわかりません。それは可能ですか?

PS私はすでに私のプログラムにトライアンドキャッチを持っています.コードを短くするためにここに投稿しませんでした.

public class DatabaseAccess <T> {
    public T[] database;
    public ArrayList<T>myList = new ArrayList<T>();
    public ArrayList<T> testlist = new ArrayList<T>();
    public void userInterface(){
    int count = 1;
        for (T i : myList){ 
            System.out.println(count++ + ": " + i);     
        }
    }
    public void readDatabase(){
        try {
                ObjectInputStream in = new ObjectInputStream(new FileInputStream("grocery.bin"));
                database = (T[]) in.readObject();
                    for (int i = 0; i < database.length; i++){
                        myList.add(database[i]);    
                }
                myList.add((T) "\n");
                myList.add((T)  "\tStudents:");
                ObjectInputStream in1 = new ObjectInputStream(new FileInputStream("students.bin"));
                database = (T[]) in1.readObject();
                    for (int i = 0; i < database.length; i++){
                         myList.add(database[i]);
                    }
    }
}



     public class Student implements Serializable, Comparable{
     private String name, id, address;
     private double gpa;

     public Student(String name, String id, double gpa){
         this.name = name;
         this.id = id;
         this.gpa = gpa;
     }
     public int compareTo(Object object){
         Student student = (Student ) object;
         if(this.gpa < student.getGpa())
              return -1;
         else
               if(this.gpa > student.getGpa())
            return 1;
               else
                    return 0;
     }
     public String getName(){ return name;}
     public String getId(){ return id;}
     public double getGpa(){ return gpa;}
     public String toString(){ return (String.format("%16s%10.4s%8s", name, id, gpa));}
}
4

2 に答える 2

2

クラス内のインスタンスStudentからメソッドにアクセスできるようにする場合は、の型を のサブクラスに制約する必要があります。TDatabaseAccessTStudent

public class DatabaseAccess<T extends Student> {
    // ...
}

ちなみに、生の代わりにStudentクラスを実装すると、メソッドが書きやすくなります。Comparable<Student>ComparablecompareTo

于 2013-08-19T04:25:24.737 に答える
0

あなたが DatabaseAccess 内を意味すると仮定すると、理論的にはそうではありません。

さて、あなたは次のようなものを使うことができますが、それは恐ろしい考えであり、絶対に悪い設計の悪臭を放ちます (悪意はありません - このコードがまったく問題ない、または使用する必要があるという印象を与えたくありません- 技術的に可能であるというだけです):

 for (T t : myList) {
    if (t instanceof Student) {
      Student student = (Student) t;
      student.getGpa();
    } else if (t instanceof Food) {
      ...
    }
 }

DatabaseAccess に関する限り、これは Student ではありません。これは、基本的に何も知らないタイプ T のランダム オブジェクトです。Student と Food の間で共通のインターフェイスを作成して目的を達成できない場合は、この DatabaseAccess がクラスの詳細を知る必要がある理由を自問し、物事をさらに分離するために設計が実際にどのように見えるべきかを理解する必要があります。正気で。

カスタム印刷を行っていますか?書式設定は Student/Food クラス内で行う必要があるかもしれません。

たとえば、ユーザー入力を処理したり、データベース内のオブジェクトからデータを操作したりしていますか? データベース アクセスとデータ操作の問題を分離します。GPA を変更する場合、必ずしもデータが ObjectOutputStream に格納されているか Oracle データベースに格納されているかを知る必要はありません。したがって、DatabaseAccess でデータベースを処理し、DatabaseAccess<Student>定義済みのインターフェイスを介して動作する他のクラスを定義し、学生固有の操作を処理するようにします。

自分が何をしようとしているのかを正確に把握していなければ、それ以上の確固たるアドバイスをすることは困難です。自分が求めていることを実行する必要があると思う場合は、一歩下がって、より良いアプローチ方法があるかどうかを考えてみてください。あなたがしないように問題。

于 2013-08-19T05:14:06.153 に答える