我在Java中有作业,请帮助。 我试图解决它,但是有一些无法理解的问题。
分配为: 在本练习中,使用Template方法模式定义一个抽象类Filter,该类具有一个公共方法过滤器(模板方法),该方法调用方法accept(钩子方法),该方法可以在不同的具体类中以不同的方式实现。通过扩展类Filter并定义accept来编写测试程序,以便仅接受最多三个字符的字符串。
public abstract class Filter<T> {
public abstract T[] filter(T[] list);
public abstract boolean accept(T val);
}
public class FilterTest<T> extends Filter<T> {
private int capacity = 0;
public FilterTest(int cap) {
this.capacity = cap;
}
@Override
public T[] filter(T[] list1) {
@SuppressWarnings("unchecked")
T[] finalList = (T[]) Array.newInstance(list1.getClass().getComponentType(), capacity);
int counter = 0;
for (T t : list1) {
if (accept(t)) {
finalList[counter] = t;
counter++;
}
}
return finalList;
}
public void printArray(T[] list2) {
for (int i = 0; i < list2.length; i++) {
if (list2[i] != null) {
System.out.print(list2[i] + " ");
}
}
System.out.println();
}
@Override
public boolean accept(T val) {
return String.valueOf(val).length() > 0 &&
String.valueOf(val).length() <= 3;
}
public static void main(String[] args) {
FilterTest<String> filterTest = new FilterTest<>(8);
String[] lists = {
"Hi", "here", "is", "the", "AOOP", "course", "at", "University"
};
System.out.print("My original list is: ");
filterTest.printArray(lists);
System.out.print(" The filtered list is: ");
String[] filteredList = filterTest.filter(lists);
filterTest.printArray(filteredList);
}
}
以下是我老师的评论: “不正确,仅Filter类中的accept方法应该是抽象的,该Filter方法应该已经在Filter类中实现,并且不是抽象的,所有实现都是相同的,只是accept方法针对不同的过滤器而改变)。” / p>
我不知道现在该怎么办,代码将如何正确。 请帮助, 谢谢
答案 0 :(得分:0)
我认为Filter应该看起来像这样
public abstract class Filter<T> {
public T[] filter(T[] list1) {
@SuppressWarnings("unchecked")
T[] finalList = (T[]) Array.newInstance(list1.getClass().getComponentType(), capacity);
int counter = 0;
for (T t : list1) {
if (accept(t)) {
finalList[counter] = t;
counter++;
}
}
return finalList;
}
public abstract boolean accept(T val);
}
您甚至可以将Filter<T>
声明为interface
,并具有默认的filter实现。看看here