Java泛型:复杂的模板定义

Java泛型:复杂的模板定义,java,generics,Java,Generics,我不确定以下内容是否足够复杂或过于复杂 它基本上归结为一个相互关联的类和接口。(见下文)感谢您的建议 /** * @param <T> item type * @param <TF> table format type */ interface EnumTableFormatItem<T, TF extends TableFormat<T>> { Object getValue(TF context, T item); Str

我不确定以下内容是否足够复杂或过于复杂

它基本上归结为一个相互关联的类和接口。(见下文)感谢您的建议

/**
 * @param <T> item type
 * @param <TF> table format type
 */
interface EnumTableFormatItem<T, TF extends TableFormat<T>> {
    Object getValue(TF context, T item);
    String getLabel();
}

/**
 * @param <T> item type
 * @param <E> enum type which specifies each column
 */
static public class EnumTableFormat
    <
       T, 
       E extends Enum<E> 
                & EnumTableFormatItem<T, EnumTableFormat<T, E>>
    > implements TableFormat<T>
{
    final private List<E> fields = new ArrayList<E>();

    public EnumTableFormat(List<E> fieldList) { this.fields.addAll(fieldList); }

    @Override public int getColumnCount() { return this.fields.size(); }
    @Override public String getColumnName(int column) {
        return this.fields.get(column).getLabel();
    }                       
    @Override public Object getColumnValue(T item, int column) {
        return this.fields.get(column).getValue(this, item);
    }
}
/**
*@param项目类型
*@param表格式类型
*/
接口EnumTableFormatItem{
对象getValue(TF上下文,T项);
字符串getLabel();
}
/**
*@param项目类型
*@param枚举类型,指定每列
*/
静态公共类枚举表格式
<
T
扩展枚举
&EnumTableFormatItem
>实现表格格式
{
最终私有列表字段=新ArrayList();
公共EnumTableFormat(List fieldList){this.fields.addAll(fieldList);}
@重写公共int getColumnCount(){返回this.fields.size();}
@重写公共字符串getColumnName(int列){
返回此.fields.get(column.getLabel();
}                       
@重写公共对象getColumnValue(T项,int列){
返回this.fields.get(column).getValue(this,item);
}
}

edit:快速回顾一下,它似乎过于复杂,我只想使用一个对象作为上下文&我认为我不应该将它与EnumTableFormat耦合

/**
 * @param <T> item type
 * @param <C> context object type
 */
public interface EnumTableFormatItem<T, C> {
    Object getValue(C context, T item);
    String getLabel();
}

/**
 * @param <T> item type
 * @param <C> context object type
 * @param <E> enum type which specifies each column
 */
static public class EnumTableFormat
    <
       T, C, 
       E extends Enum<E> 
                & EnumTableFormatItem<T, C>
    > implements TableFormat<T>
{
    final private List<E> fields = new ArrayList<E>();
    final private C context;

    public EnumTableFormat(C context, List<E> fieldList) { 
        this.fields.addAll(fieldList);
        this.context = context;
    }

    @Override public int getColumnCount() { return this.fields.size(); }
    @Override public String getColumnName(int column) {
        return this.fields.get(column).getLabel();
    }                       
    @Override public Object getColumnValue(T item, int column) {
        return this.fields.get(column).getValue(this.context, item);
    }
}

(见我的答案)

你喜欢这项工作吗

/**
 * @param <T> item type
 */
interface EnumTableFormatItem<T> {
    Object getValue(TableFormat<T, ?> context, T item);
    String getLabel();
}

/**
 * @param <T> item type
 * @param <E> enum type which specifies each column
 */
static public class EnumTableFormat<T, E extends Enum<E> & EnumTableFormatItem<T>>
        implements TableFormat<T>
{
    final private List<E> fields = new ArrayList<E>();

    public EnumTableFormat(List<? extends E> fieldList) {
        this.fields.addAll(fieldList);
    }

    @Override public int getColumnCount() {
        return this.fields.size();
    }

    @Override public String getColumnName(int column) {
        return this.fields.get(column).getLabel();
    }

    @Override public Object getColumnValue(T item, int column) {
        return this.fields.get(column).getValue(this, item);
    }
}
/**
*@param项目类型
*/
接口EnumTableFormatItem{
对象getValue(TableFormat上下文,T项);
字符串getLabel();
}
/**
*@param项目类型
*@param枚举类型,指定每列
*/
静态公共类枚举表格式
实现表格格式
{
最终私有列表字段=新ArrayList();
公共枚举表格式(列表
edit:快速回顾一下,它似乎过于复杂,我只想使用一个对象作为上下文&我认为我不应该将它与EnumTableFormat耦合

/**
 * @param <T> item type
 * @param <C> context object type
 */
public interface EnumTableFormatItem<T, C> {
    Object getValue(C context, T item);
    String getLabel();
}

/**
 * @param <T> item type
 * @param <C> context object type
 * @param <E> enum type which specifies each column
 */
static public class EnumTableFormat
    <
       T, C, 
       E extends Enum<E> 
                & EnumTableFormatItem<T, C>
    > implements TableFormat<T>
{
    final private List<E> fields = new ArrayList<E>();
    final private C context;

    public EnumTableFormat(C context, List<E> fieldList) { 
        this.fields.addAll(fieldList);
        this.context = context;
    }

    @Override public int getColumnCount() { return this.fields.size(); }
    @Override public String getColumnName(int column) {
        return this.fields.get(column).getLabel();
    }                       
    @Override public Object getColumnValue(T item, int column) {
        return this.fields.get(column).getValue(this.context, item);
    }
}
/**
*@param项目类型
*@param上下文对象类型
*/
公共接口EnumTableFormatItem{
对象getValue(C上下文,T项);
字符串getLabel();
}
/**
*@param项目类型
*@param上下文对象类型
*@param枚举类型,指定每列
*/
静态公共类枚举表格式
<
T、 C,
扩展枚举
&EnumTableFormatItem
>实现表格格式
{
最终私有列表字段=新ArrayList();
最终私有C上下文;
公共EnumTableFormat(C上下文,列表字段列表){
this.fields.addAll(字段列表);
this.context=上下文;
}
@重写公共int getColumnCount(){返回this.fields.size();}
@重写公共字符串getColumnName(int列){
返回此.fields.get(column.getLabel();
}                       
@重写公共对象getColumnValue(T项,int列){
返回this.fields.get(column).getValue(this.context,item);
}
}
+1查看您的
列表