0

如何访问学生类中的方法。当我打印 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>而不是 raw Comparable,你的compareTo方法会更容易编写。

于 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 需要知道类的细节,并弄清楚设计应该是什么样子来分开更多的东西理智地。

你在做一些定制印刷吗?也许格式化应该在学生/食物类中完成。

例如,您是否正在处理用户输入和处理来自数据库中对象的数据?将数据库访问和数据操作的关注点分开。更改 GPA 不一定要求您知道数据是存储在 ObjectOutputStream 还是 Oracle 数据库中。因此,让 DatabaseAccess 处理数据库,并DatabaseAccess<Student>通过一些定义的接口定义其他一些与 a 一起工作的类,并让它处理特定于学生的操作。

在不确切知道自己想要做什么的情况下,很难给出可靠的建议:如果你认为你需要做你所要求的,你可能想退后一步,想想是否有更好的方法来接近问题,这样你就不会。

于 2013-08-19T05:14:06.153 回答