【发布时间】:2019-02-01 17:57:24
【问题描述】:
我正在为大学做家庭作业,该作业不允许我更改课程的属性。我想出了以下用于搜索方法的代码,但我不禁注意到重复的代码。我需要建立两种搜索方法。一种搜索ArrayList<Person>,另一种搜索ArrayList<Module。 Person 和 Module 都有一个 String name 属性。
public static <T extends Person> ArrayList<T> findPerson(List<T> list, String query) {
ArrayList<T> matching = new ArrayList<>();
list.forEach(s -> {
if (s.name.contains(query)) matching.add(s);
});
return matching;
}
public static <T extends Module> ArrayList<T> findModule(List<T> list, String query) {
ArrayList<T> matching = new ArrayList<>();
list.forEach(s -> {
if (s.name.contains(query)) matching.add(s);
});
return matching;
}
是否可以在不改变类结构的情况下组合这些方法?我尝试了一些类似的方法,但它似乎仍然不起作用:(方法签名中的不同类型参数)
public static <T extends Person, Module> ArrayList<T> findModule(List<T> list, String query) {
ArrayList<T> matching = new ArrayList<>();
list.forEach(s -> {
if (s.name.contains(query)) matching.add(s);
});
return matching;
}
编辑:这里是类:
public abstract class Person extends TableItem {
public String name, famName, street, zip, city;
public String[] data = new String[7];
...
}
public class Module extends TableItem {
private Manager manager;
public String[] data = new String[5];
public String name, nr, profID, semester, part;
public ArrayList<String> participants;
...
}
public abstract class TableItem {
public abstract String getString();
public abstract void updateData();
}
【问题讨论】:
-
Person和Module是实现同一个接口,还是扩展同一个基类? -
不,他们没有。编辑。哎呀,他们有,但它不是我需要搜索的领域
-
你能把课程放在你的问题中吗?如果你决定让它们实现一个通用接口,这会不会有问题?
-
名称(和其他字段)是否有 getter 方法?
-
@rgettman 是的,我现在意识到确实有一个公共 getter
getString()是类中几个字符串字段的串联。其中一个组件是name,因此String.contains方法将起作用。