Java - 如何在泛型类中调用类T的方法

时间:2014-06-01 00:28:58

标签: java generics methods

我的课程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,但是如何扩展多个类?

谢谢

2 个答案:

答案 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
    }
}