[英]Java - How to call a method of my class T in a generic class
我的類ListFromFile<T>
擴展了ArrayList<T>
遇到問題。 在該類中,我想創建一個通過其id
屬性查找元素並將其返回的方法。
T
可以是來自Student,Teacher等類的對象。所有這些類都有用於測試id的equals方法。
我的問題是我不能使用測試ListFromFile
的id的equals方法。
這是我的代碼:
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方法中指定我使用的是一個int的ID, getElement()
也找不到該元素...
經過一些搜索后,似乎我必須按學生,教師等來擴展T,但是如何擴展倍數類?
謝謝
您應該將接口或抽象類與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;
}
}
這是示例應用程序,顯示了如何解決此問題:
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.