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

我有一个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);
}


当我尝试创建通用的Abstract类时,我陷入了困境

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类使用相同的泛型,即TableTwo<T> implements ITable<T>,但是TableTwo严格限制了使用Pair<CustomObj, CustomObj>的使用。

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

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

最佳答案

该接口有一些问题:

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


您需要一个返回类型和一个泛型:

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


方法的返回类型

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


在声明和实现中应为Collection或void。

关于java - 自定义表的通用设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34160384/

10-10 04:10