Java 泛型和数组列表
我如何在学生课堂上使用这些方法。当我打印我的列表时,它在students类中使用toString,我不知道如何访问其他方法。这可能吗 PS我的程序中已经有了try-and-catch,我只是没有在这里发布代码来缩短代码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
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) {
...
}
}