Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型和数组列表_Java_Generics_Arraylist - Fatal编程技术网

Java 泛型和数组列表

Java 泛型和数组列表,java,generics,arraylist,Java,Generics,Arraylist,我如何在学生课堂上使用这些方法。当我打印我的列表时,它在students类中使用toString,我不知道如何访问其他方法。这可能吗 PS我的程序中已经有了try-and-catch,我只是没有在这里发布代码来缩短代码 public class DatabaseAccess <T> { public T[] database; public ArrayList<T>myList = new ArrayList<T>(); public

我如何在学生课堂上使用这些方法。当我打印我的列表时,它在students类中使用toString,我不知道如何访问其他方法。这可能吗

PS我的程序中已经有了try-and-catch,我只是没有在这里发布代码来缩短代码

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));}
}
公共类数据库访问{
公共T[]数据库;
public arraylistylist=new ArrayList();
public ArrayList testlist=new ArrayList();
公共void用户接口(){
整数计数=1;
对于(ti:myList){
System.out.println(count+++“:”+i);
}
}
公共void readDatabase(){
试一试{
ObjectInputStream in=新的ObjectInputStream(新文件输入流(“gery.bin”);
.readObject()中的数据库=(T[]);
for(int i=0;istudent.getGpa())
返回1;
其他的
返回0;
}
公共字符串getName(){return name;}
公共字符串getId(){return id;}
public double getGpa(){return gpa;}
公共字符串toString(){return(String.format(“%16s%10.4s%8s”,name,id,gpa));}
}

如果希望能够从
DatabaseAccess
类中的
T
实例访问
Student
方法,则必须将
T
的类型约束为
Student
的子类:

public class DatabaseAccess<T extends Student> {
    // ...
}
公共类数据库访问{
// ...
}

顺便说一下,如果你让你的
学生
类实现
可比
而不是原始的
可比
,你的
比较到
方法将更容易编写。

假设你的意思是在数据库访问范围内,理论上你不会

现在,您可以使用以下内容,但这是一个可怕的想法,绝对散发着糟糕的设计气息(无意冒犯-我只是不想给人这样的印象,即此代码完全可以使用,或者您应该使用它-只是技术上可行):

就DatabaseAccess而言,它不是一个学生。它是一个类型为T的随机对象,我们基本上对它一无所知。如果你不能在学生和食物之间创建一个通用接口来做你想做的事情,你必须问问自己,为什么DatabaseAccess需要知道类的具体情况,并弄清楚设计应该做什么我们看起来真的更理智地把事情分开了

你在做一些自定义打印吗?也许格式化应该在学生/食品类中完成

例如,您是否正在处理用户输入和操作数据库中对象的数据?请将数据库访问和数据操作分开。更改GPA不一定需要您知道数据是存储在ObjectOutputStream还是Oracle数据库中。因此,让DatabaseAccess处理数据库e、 并通过一些已定义的接口定义另一个类,该类与
数据库访问
一起工作,并让该类处理特定于学生的操作


如果你不知道自己想做什么,就很难给出可靠的建议:如果你认为自己需要按照自己的要求去做,你可能会想退后一步,想想是否有更好的方法来解决这个问题,这样你就不会这样做了。

这里有很多演员阵容,至少有一两个我认为不需要进行调整ng位置,我认为缺少一个。你想完成什么?如果有堆栈,它们是什么?你能用硬编码的输入而不是某个文件来重现这个问题吗(这会使计算速度更快)?我正在尝试访问学生类中的getMeethods,我不知道如何访问。还有什么缺少的类型转换?我不需要什么类型转换?看起来
t
总是一个
String
,这让我觉得你根本不需要type参数。否则,你将字符串转换为
t
的代码将导致一些堆问题列表中的污染,可能会使代码在运行时失败。@ChrisJester-Young好吧,我是在定义的上下文中说的:“参数化类型的变量可能会引用非该参数化类型的对象。这种情况称为堆污染。”@EdwinDalorzo提出了一个观点。我能让它扩展两个类吗?因为我需要访问两个类。学生和食品类中的方法与学生类似。你能让
Student
Food
实现相同的接口,以及你需要使用的所有方法吗?然后在
T
的b中使用该接口即可嗯。
 for (T t : myList) {
    if (t instanceof Student) {
      Student student = (Student) t;
      student.getGpa();
    } else if (t instanceof Food) {
      ...
    }
 }