自定义表

时间:2015-12-08 15:59:24

标签: java generics design-patterns

如果有语法问题,请原谅我。这样做的目的不是为了获得完美的代码而是为了获得设计。

我有interface ITable<T>

public interface ITable<T> {
    public Collection<T> getEntries();
    public void add(CustomObj value);
    public Collection<CustomObj> getCustomObjects();
}

由两个类使用:

TableOne<CustomObj>TableTwo<Pair<CustomObj, CustomObj>>

然后我有一个使用函数

应用这些表的接口
public interface ITableFunction<T> {
    public abstract Collection<ITable<?>> execute(Collection<ITable<T>> tables);
}

当我尝试创建一个通用的抽象类

时,我的困境就出现了
public abstract class AbstractTableFunctionCombined<T> implements ITableFunction<T>{
    private boolean someBool;
    public AbstractTableFunctionCombined(boolean someBool){
        this.someBool = someBool;
    }
    @Override
    public Collection<ITable<?>> execute(Collection<ITable<T>> tables){
        // What i would like to do, but can't right now:
        ITable<T> combinedTable;
        if (someBool){
            combinedTable = new TableOne();
        } else {
            combinedTable = new TableTwo();
        }
        for(ITable<T> table : tables){
            combinedTable.addAll(table.getCustomObjects());
        }
        for(T entry : table.getEntries()){
            execute(entry);
        }
    }
    public abstract void execute(T entry);

}

问题在于我无法保证类型T与我尝试实例化的表格相同。我以为我必须从Pair<CustomObj, CustomObj>和常规CustomObj创建某种关系。我尝试创建一个Entry接口,这两个接口都会使用,ITable<T>ITable<T extends Entry>,但这又遇到了同样的问题。

我还想过,也许我可以让TableOneTableTwo类使用相同的Generic TableTwo<T> implements ITable<T>,但TableTwo使用Pair<CustomObj, CustomObj>有严格的限制。< / p>

我是否必须创建两个单独的类:AbstractTableFunctionOne<CustomObj>AbstractTableFunctionTwo<Pair<CustomObj, CustomObj>>?我想避免这种情况,因为它会有很多重复的代码。

或者我是否强迫这种面向对象的设计? TableOne和TableTwo甚至不应该实现相同的接口吗?

1 个答案:

答案 0 :(得分:0)

此界面有一些问题:

public interface ITableFunction {
    public abstract execute(Collection<ITable<T>> tables);
}

您需要返回类型和Generic:

public interface ITableFunction<T> {
    public abstract void execute(Collection<ITable<T>> tables);
}

并返回Method

的类型
public Collection<ITable<T>> execute(Collection<ITable<T>> tables){
..

应该是声明和实现中的集合或无效。