【问题标题】:Overriding methods in Collection<T> [closed]覆盖 Collection<T> 中的方法 [关闭]
【发布时间】:2016-01-27 02:24:53
【问题描述】:

我正在做一个班级作业,我有一个集合,它将被过滤掉。例如,作为接口的过滤器类是一种接受 T 元素的方法(匹配)。

在我的 FilterCollection 类中:

public class FilteredCollection<T> extends AbstractCollectionDecorator<T> {

Collection<T> filterCollection;
Filter<T> currentFilter;


private FilteredCollection(Collection<T> coll, Filter<T> filter) {
    super(coll);
    this.filterCollection = coll;
    this.currentFilter = filter;
}


public static <T> FilteredCollection<T> decorate(Collection<T> coll, Filter<T> filter) {
    return new FilteredCollection<T>(coll, filter);
}

从那里我必须重写方法,例如 add、addall、contains、remove 等。

使用 add() 方法

@Override
public boolean add(T object)
{
    return filterCollection.add(object);
}

但是,我需要查看对象是否与过滤器中的内容匹配,如果匹配,请不要添加它,如果不匹配,请添加它。解决这个问题的正确方法是什么?

【问题讨论】:

  • Filter 在哪里定义?在某个图书馆,或者你创造的东西?在任何情况下,您似乎在 add 方法中有一个 if 语句,可以根据过滤器中定义的某些行为有条件地添加。
  • 过滤器是一个接口。布尔匹配(T 元素);那是过滤器中唯一的东西。它是一个单独的类。

标签: java generics


【解决方案1】:

你需要检查是否currentFilter.matches这个对象。如果是这样,那么添加它。如果成功添加对象,则返回true。否则返回false

@Override
public boolean add(T object)
{
    if (currentFilter.matches(object)) {
        return filterCollection.add(object);
    }
    return false;
}

【讨论】:

    【解决方案2】:

    由于Filter 是一个接口,你需要给它一个实现。例如:

    public class MyFilter<T> implements Filter<T> {
        boolean matches(T element) {
            if (something) {
                return true;
            } else {
                return false;
            }
        }
    }
    

    然后在您的 FilteredCollection.add() 方法中,您可以执行以下操作:

    @Override
    public boolean add(T object) {
        if (currentFilter.matches(object)) {
            // it matches: add it
        } else {
            // it doesn't match: do something else
        }
    }
    

    【讨论】:

    • 这行不通我不需要向Filter.java 接口添加任何方法。如果布尔添加在 FilteredCollection.java 类中,那么它不会匹配。
    • @AndroidDevNoob 您无需向Filter.java 添加任何内容。然而,由于Filterinterface 而不是class,你必须给它一个实现:创建一个implements Filter新类。然后,在add() 方法inside FilteredCollection 类中,您可以检查要添加的对象是否与过滤器匹配。
    • @timtim17,你怎么知道操作还没有使用过滤器的实现?如果已经使用了有效的实现,那么告诉操作员他/她将需要实现 Filter 可能会产生误导。当 op 初始化 FilteredCollection 时,他必须已经传递了一个 Filter。如果它是一个实例,那么该操作已经在使用一个实现。
    猜你喜欢
    • 2013-03-16
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多