在他写道的最后一章中,我读到了约书亚·布洛奇的“有效Java第二版”第29项,其中描述了如何创建异构容器:
以这种方式使用的Class对象称为类型令牌。您还可以使用自定义键类型。例如,可以有一个DatabaseRow类型表示数据库行(容器),一个泛型类型列作为它的键。
它想知道我和我写了这个执行,他已经提到。有什么事我可以做得更好吗?我最感兴趣的是Column类,它充当Type Token
class Column<T> {
@SuppressWarnings("unchecked")
public T cast(Object obj) {
return (T) obj;
}
}
public class DatabaseRow {
private Map<Column<?>, Object> row = new HashMap<>();
public <T> void putColumn(Column<T> type, T instance) {
row.put(type, type.cast(instance));
}
public <T> T getColumn(Column<T> type) {
return type.cast(row.get(type));
}
public static void main(String[] args) {
DatabaseRow db = new DatabaseRow();
Column<Integer> colInt = new Column<>();
Column<Double> colDouble = new Column<>();
db.putColumn(colInt, 1);
db.putColumn(colDouble, 10.0);
System.out.println(colInt.getClass() + " " + colDouble.getClass());
System.out.println(db.getColumn(colInt) + " " + db.getColumn(colDouble));
}
}发布于 2014-06-30 22:39:36
我想在此指出两件事。
putColumn调用上执行强制转换。方法签名是:public <T> void putColumn(Column<T> type, T instance) {,因此我们知道实例已经是T类型,并且它存储在Map中的Object值中。没有理由在存储之前强制转换。Class<T>实例更好地完成列的cast方法。考虑在列的构造函数中要求类实例的“标准”模式。例如:类Column {私有最终Class valClass;公共列(Class valClass) { this.valClass = valClass;}公共T强制转换(Object obj) {返回obj == null?null : valClass.cast(obj);}这具有不需要SuppressWarnings的好处。由于其他原因,它也是有帮助的。该类将用作: Column col = new (String.class);除此之外,情况将是相同的。https://codereview.stackexchange.com/questions/55737
复制相似问题