【问题标题】:Java - How to call a method of my class T in a generic classJava - 如何在泛型类中调用我的类 T 的方法
【发布时间】:2014-06-01 00:28:57
【问题描述】:

我的课程 ListFromFile<T> 扩展了 ArrayList<T> 有问题。 在那个类中,我想创建一个方法,通过它的id 属性找到一个元素并返回它。

T 可以是 Student、Teacher 等类的对象。所有这些类都有一个 equals 方法来测试 id。

我的问题是我不能使用 equals 方法来测试 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 方法中指定我使用的是 int 的 id,getElement() 也找不到元素 ...

经过一番搜索,似乎我必须通过 Student、Teacher 等来扩展 T,但是如何扩展多个类?

谢谢

【问题讨论】:

  • 1) 您可能想使用bounded type of generic。 2) 所有Java 类都有一个public boolean equals(Object o) 方法,该方法继承自Object 类,即所有类的父类。我还是不明白为什么不能调用这个方法。
  • 你的StudentTeacher等等都有getId()之类的方法吗?如果不是,那么说特定的Student“等于”特定的整数是什么意思?
  • @HovercraftFullOfEels 是的,equals(Object o) 有效,但我只想检查 id 而不是所有属性。 @DavidWallace 是的,这些类有一个方法getId()equals 允许我访问列表中具有特定 id 的元素。
  • 您正在将一个不是整数的对象与一个整数进行比较。他们永远不会平等。

标签: java generics methods


【解决方案1】:

您应该使用带有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;
    }
}

【讨论】:

  • 你会注意到我删除了implements Serializable - 你不需要这个,因为你已经指定你的类扩展了ArrayList
  • 非常感谢,我很高兴,因为它有效! :)
【解决方案2】:

这是一个示例应用程序,展示了如何解决这个问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2012-04-21
    • 2013-07-23
    相关资源
    最近更新 更多