我目前正在为我正在学习的 Java 编程课程做家庭作业。我不是要一个确切的答案,而是要一些指导。
我正在处理的问题是:
我有一个实现过滤器接口的过滤器类。这个接口只有一种方法——matches(T element)
我已经配置了我的过滤器方法来检查传入的整数是否为素数。
还有一个装饰器类,它装饰一个集合类以仅显示通过过滤器的对象。
我在让 contains(Object o) 方法正常工作时遇到问题。
基本上,类contains(Obj o)
中的方法 FilteredCollection
应该首先检查对象是否通过过滤器,然后如果通过,则调用该contains()
对象上的未修饰方法。
假设我希望能够将此类FilteredCollection
与许多不同类型的过滤器一起使用,我如何确定传入的对象类型,然后能够将该对象传递给当前正在实现的过滤器。
这是我的PrimeNumberFilter
课:
public class PrimeNumberFilter implements Filter<Integer> {
public boolean matches(Integer e) {
int n = e.intValue();
if (n != 2 && n % 2 == 0) {
return false;
}
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
然后这是我的缩短FilteredCollection
课程:
class FilteredCollection<T> implements Collection<T> {
Collection<T> fc;
Filter<T> currentFilter;
private FilteredCollection(Collection<T> coll, Filter<T> filter) {
this.fc = coll;
this.currentFilter = filter;
}
public static <T> FilteredCollection<T> decorate(Collection<T> coll,
Filter<T> filter) {
return new FilteredCollection<T>(coll, filter);
}
public boolean contains(Object o) {
//What do I do here?
return fc.contains(o);
}
传递给 contains 方法的对象必须通过过滤器,在本例中为PrimeNumberFilter
.
我得到的错误是它一直想将对象转换为类型 T,而且我知道由于擦除,这永远不会起作用。
我做了很多研究,我把它归结为需要使用反射。
我的导师给我的唯一提示是该对象只有几种我可以使用的方法,我应该使用其中一种。
谢谢你的帮助!
编辑: 项目的要求之一是不要以任何方法将对象转换为 T 。因此,尽管这些答案很棒,但我无法使用其中任何一个。