2013-06-05 52 views
4

我喜歡在java中創建數據庫表的類表示。 列被設計爲泛型類,以便它可以處理表列可能具有的所有不同數據類型。將不同的參數化類型存儲在Java中的同一通用數組列表中

public class TableColumn<T> { 
    ... 
} 

表有0,...,N TableColumn來,所以我的表類看起來像:

public class Table { 
    protected ArrayList<TableColumn<T>> columns = 
       new ArrayList<TableColumn<T>>(); 
    ... 
} 

的想法是通過以下方式添加列。

Table t = new Table(); 
t.addColumn(String.class); 
t.addColumn(Integer.class); 
t.addColumn(Date.class); 
t.addColumn(String.class); 

,然後我可以操控通過以下方式的數據:

String a = t.Cols(2).Row(3); 
t.Col(2).Row(3) = "b"; 

但我失去類型的Safty我目前achiving那...我的問題是如何實現,因爲列的方式潛在的不同數據類型列可以獲得。

有人有線索嗎?

+0

所以你想'col(2)'是一個不同於col(3)'的類型?這是不可能的。只是因爲類型檢查發生在編譯時,並且參數*值*對這些沒有影響。 –

+0

有沒有其他可行的方法來做到這一點?另一種概念另一種結構 –

+0

你可以通過' T get()'方法將其僞裝成'T'來僞造*。這將允許'String x = foo.get()'和'Integer x = foo.get()'進行編譯。但這也是缺點:你失去了所有編譯時類型檢查。當你錯誤地使用它時,它只會在運行時崩潰並燒燬。 –

回答

0

如果數量有限,可以使用接口作爲這些組合。這將允許您以相同的方式存儲列,並且您不需要任何特殊的投射。

t.addColumn(MyInterface.class); 

另一種方法,這仍然不能像你想要的一樣乾淨,但那種不可避免的,是用一個新的類,允許你採取的一些鑄造和類型的負擔檢查。

例子:

public static class MyWrapper{ 
    Class<?>[] validPossibleClasses; 
    Object o; 
    public MyWrapper(Class<?> ...classes){ 
     this.validPossibleClasses = classes; 
    } 
    public boolean validateClass(Class<?> clazz){ 
     for (Class<?> c : validPossibleClasses){ 
      if (!c.isAssignableFrom(clazz)) 
       return false; 
     } 
     return true; 
    } 
    public void set(Object o) throws Exception{ 
     if (!validateClass(o.getClass())) 
      throw new Exception("Bad Cast"); 
     this.o = o; 
    } 
    public String getString(){ 
     return (String) o; 
    } 
    public Integer getInt(){ 
     return (Integer) o; 
    } 
    ... 
    // more specific getters 
} 

的使用會是這樣

String a = t.Cols(2).Row(3).getString(); 
t.Col(2).Row(3).set("b"); 
+0

你能詳細解釋一下嗎? –

+0

等待,您是否在尋找另一種存儲列的方式?或者在一列中使用多種類型時遇到問題? – greedybuddha

+0

兩者。起初我想在一列中使用多種類型而不會丟失類型安全性。如果這不可能,另一種方法會很好。 –

0

爲什麼不只是爲你創造讓每個表中的不同對象?喜歡的東西:

級的玩家與字段:

String name; 
int points; 
int number; 

班體育場與字段:

String location; 
Date dateBuilt; 

一流的團隊與領域:

String name; 
ArrayList<Players> roster; 

然後,你可以只保存所有值列表或arraylist並讓他們分開的數據庫表,而不必猜測在哪個你必須擁有更多的物體,但是你可以更多地瞭解你正在處理的事物。

+0

問題是,我不知道我的表有多少列,我不知道他們將不會是哪種類型... –

相關問題