1

我正在尝试基于通用范围实现各种数据类别的通用过滤器。在第一次迭代中,这是针对 JTable,我们知道列的名称和列中的数据类别。在这种情况下,过滤器视图如下所示:

ColumnTitle comboBox: is/is not comboBox: =, >, < , textBox min, textBox max

其中表列可能是 XML 构建器中指定的 String、double、int 等,并且可能有多行这些列要根据其他列进行过滤。[显然其中许多存在于世界上。]

我想基本上通过使用如下所示的Range类将其与 RowFilters 联系起来:

public class Range<T extends Comparable<? super T>> {

T low;
T high;

public Range(T aLow, T aHigh) {
    low = aLow;
    high = aHigh;
}

public boolean includes(T value) {
    boolean result = true;
    if ((getLow() != null) && (getLow().compareTo(value) > 0)) {
         return false;
    }

    if ((getHigh() != null) && (getHigh().compareTo(value) < 0)) {
         return false;
    }

    return true;
}

public T getLow() {
    return low;
}

public void setLow(T low) {
    this.low = low;
}

public T getHigh() {
    return high;
}

public void setHigh(T high) {
    this.high = high;
}

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("Range = ").append(low).append(" to ").append(high);
    return sb.toString();
}
}

我的想法是本质上(不是下面的真实代码)构建以下列表:

class Filter { 
    Range<?> range;
    String name;
    Class<?> filterClass;
}

在单个过滤器视图(或控制器)中进行类比较,然后将它们转换为RowFilter需要应用它们的时间。

我正在使用的代码库有 100 条语句,我完全厌恶这些语句,例如: if (bob instanceof Person)...

为了避免这种情况,我遇到了泛型和类转换的问题。

这是泛型类型擦除不可避免的问题吗?如果是这样,是否有一些体面的解决方法可以避免课堂测试分散在各处?

不幸的是,我不能: - 使用 Guava 或 Java 以外的任何东西(甚至 6 个)。- 重做基于 XML 的整个表构建器。- 使用数据库

一定有很多应用程序有一个表或数据库并且在代码编译时不知道数据描述?

4

1 回答 1

2

TableModel您可以使用以下级别过滤事物,而不是编写一堆过滤器代码TableRowSorter

使用 TableModel 提供排序和过滤的 RowSorter 实现。

RowFilter并按照您的描述实现一个泛型。

擦除不应该​​进入它,而不是要求以Comparable适合最终用户排序的方式实现事物(这可能需要对区域设置敏感),我会Comparator<? super T>取而代之并让该排序值。这样,您也可以null始终如一地处理 s 。

于 2012-10-26T21:36:49.090 回答