[問題] 型態不同的二維資料

看板java作者 (Washi_Keelar)時間14年前 (2012/01/21 05:48), 編輯推噓1(106)
留言7則, 2人參與, 最新討論串1/1
第一次在貴板提問, 如果小弟爬文不確實或違反板規, 文章將在 24 內自行消毀 XD 我想要造一個 Table (可以想成二維陣列), 但是每一個 column 的 Type 不一樣 (就像資料庫中 Table, 每一筆資料中有好幾個不同型態的欄位) 而每一個 column 的 Type 不是事先知道的, 是程式執行時才知道的. 想問一下在 Java 裡頭, 怎麼樣實作這樣的結構最有效率 謝謝 ! 底下是我的實作方式, 不過東西存得進去, 但讀出來時卻無法知道 Type :~ public class RecordTable { private ArrayList<RecordColumn<?>> columns; // 二維且型態不同的 Table .... // addValue 沒有問題 public <T> void addValue(int columnId, T value) { RecordColumn<?> column = columns.get(columnId); column.addObject(value); } // 想要寫的 getValue, 我知道這樣子 compile 不會過 public <T> T getValue(int columnId, int index) { RecordColumn<?> column = columns.get(columnId); return column.get(index); // arrayList 本身的 get } // 另一個版本, 雖然加上 cast 但還是沒有辦法 :~ public <T> T getValue(int columnId, int index) { RecordColumn<?> column = columns.get(columnId); return column.castValue(column.getObject(index)); } // 這個是 OK 的, 不過只知道是 Object, 不知道原本的 type public Object getObject(int columnId, int index) { return columns.get(columnId).getObject(index); } } // RecordTable // 這邊我原 code 用的是 composition, 不過意思上就是下面的繼承 public class RecordColumn<E> extends ArrayList<E> { private final Class<E> type; ... public RecordColumn(Class<E> type, int initialCapacity) { super(initialCapacity); this.type = type; } ... // 加資料進去沒有問題, type 不對的話會有 exception public boolean addObject(Object e) { return add(type.cast(e)); } // 底下兩個配合上方藍色的 highlight public Object getObject(int index) { return get(index); } public E castValue(Object e) { return type.cast(e); } } // RecordColumn 如果您看到這行的話, 非常感謝您了解我的問題. 謝謝 ! -- ◢██████ █◤▂▃ █ █▌ ° █ ◢ ◢█◣ ◢█◣ █ ◢██ █◢◣ ◥█████ █◢◤ █▅█ █▅█ █ █ █ █◤ ███◤ █◥◣ █ █ █ █ █ █ ◥█◤ █ ◥◣◥█◤ ◥█◤ ██ █◤█◣ █ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 96.42.26.222 ※ 編輯: keelar 來自: 96.42.26.222 (01/21 07:28)

01/21 09:17, , 1F
用了caseValue的Error message是什麼?
01/21 09:17, 1F

01/21 09:34, , 2F
incompatible types 會出現在藍色那一行
01/21 09:34, 2F

01/21 09:39, , 3F
ps: 是 compile error
01/21 09:39, 3F

01/21 09:42, , 4F
應該說, 藍色那一行如果不 return 不會出錯
01/21 09:42, 4F

01/21 09:44, , 5F
可是總要能把數值傳出去 :~
01/21 09:44, 5F

01/21 09:51, , 6F
試試看(T)(column.getObject(index))?
01/21 09:51, 6F

01/21 13:54, , 7F
沒 error 了! 不過變成一個 unchecked cast 的 warning XD
01/21 13:54, 7F
文章代碼(AID): #1F6U4atY (java)