我的课程ListFromFile<T>
的问题扩展了ArrayList<T>
。
在该类中,我想创建一个方法,通过其id
属性查找元素并返回它。
T
可以是Student,Teacher等类的对象。所有这些类都有一个equals方法来测试id。
我的问题是我无法使用等于ListFromFile
中的ID测试方法。
这是我的代码:
public class ListFromFile<T> extends ArrayList<T> implements Serializable {
public T getElement(int id) {
for ( T o : this ) {
if ( o.equals((int)id) ) {
return o;
}
}
return null;
}
}
即使我在equals方法中指定我使用id为int,getElement()
也找不到元素...
经过一些搜索,似乎我必须通过学生,教师等扩展T,但是如何扩展多个类?
谢谢
答案 0 :(得分:3)
您应该使用带有getId()
方法的接口或抽象类。将T
绑定为接口或抽象类的子类型。使用界面,它可能看起来像这样。
public interface ObjectWithId {
int getId();
}
public class Student implements ObjectWithId {
// ...
}
public class Teacher implements ObjectWithId {
// ...
}
public class ListFromFile<T extends ObjectWithId> extends ArrayList<T> {
public T getElement(int id) {
for ( T o : this ) {
if ( o.getId() == id ) {
return o;
}
}
return null;
}
}
答案 1 :(得分:0)
以下示例应用程序显示了如何解决此问题:
import java.io.Serializable;
import java.util.ArrayList;
public class test2 {
// define basic interface for all objects
interface ObjectWithID {
public int getId();
}
public static class Teacher implements ObjectWithID {
private final int id;
public Teacher(final int id) {
this.id = id;
}
@Override
public int getId() {
return this.id;
}
}
public static class Student implements ObjectWithID {
private final int id;
public Student(final int id) {
this.id = id;
}
@Override
public int getId() {
return this.id;
}
}
// note T extends syntax
public static class ListFromFile<T extends ObjectWithID> extends ArrayList<T> implements Serializable {
public T getElement(final int id) {
for (final T o : this)
if (o.getId() == id)
return o;
return null;
}
}
public static void main(final String[] args) {
final ListFromFile list = new ListFromFile<>();
list.add(new Teacher(1));
list.add(new Teacher(2));
list.add(new Teacher(3));
list.add(new Student(4));
list.add(new Student(5));
list.add(new Student(6));
System.out.println(list.getElement(1)); // print teacher
System.out.println(list.getElement(4)); // print student
}
}