作者keelar (Washi_Keelar)
看板java
标题[问题] 型态不同的二维资料
时间Sat Jan 21 05:48:13 2012
第一次在贵板提问, 如果小弟爬文不确实或违反板规, 文章将在 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)
1F:推 zhengdavy:用了caseValue的Error message是什麽? 01/21 09:17
2F:→ keelar:incompatible types 会出现在蓝色那一行 01/21 09:34
3F:→ keelar:ps: 是 compile error 01/21 09:39
4F:→ keelar:应该说, 蓝色那一行如果不 return 不会出错 01/21 09:42
5F:→ keelar:可是总要能把数值传出去 :~ 01/21 09:44
6F:→ zhengdavy:试试看(T)(column.getObject(index))? 01/21 09:51
7F:→ keelar:没 error 了! 不过变成一个 unchecked cast 的 warning XD 01/21 13:54