2010-04-30 57 views
2

我不確定以下內容是否足夠複雜或過於複雜。它基本上歸結爲一個相互關聯的類和接口。 (見下文)的建議表示讚賞....Java泛型:複雜模板定義

/** 
* @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); 
    } 
} 

編輯:在一個快速的反映,它似乎過於複雜,我只是想使用一個對象上下文&我覺得我不應該已經將它連接到EnumTableFormat。

(看我的回答)

回答

0

編輯:在一個快速的反映,它似乎過於複雜,我只是想使用一個對象上下文&我想我不該把耦合到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); 
    } 
} 
1

會這樣的工作嗎?

/** 
* @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); 
    } 
} 
+0

+1爲您的'列表'在構造函數中。否則,我喜歡分離出我的上下文對象。 – 2010-04-30 15:47:11