首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typesafe异类容器

Typesafe异类容器
EN

Code Review用户
提问于 2014-06-30 22:29:15
回答 1查看 1.8K关注 0票数 5

在他写道的最后一章中,我读到了约书亚·布洛奇的“有效Java第二版”第29项,其中描述了如何创建异构容器:

以这种方式使用的Class对象称为类型令牌。您还可以使用自定义键类型。例如,可以有一个DatabaseRow类型表示数据库行(容器),一个泛型类型列作为它的键。

它想知道我和我写了这个执行,他已经提到。有什么事我可以做得更好吗?我最感兴趣的是Column类,它充当Type Token

代码语言:javascript
复制
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));
    }

}
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-06-30 22:39:36

我想在此指出两件事。

  1. 没有必要在putColumn调用上执行强制转换。方法签名是:public <T> void putColumn(Column<T> type, T instance) {,因此我们知道实例已经是T类型,并且它存储在Map中的Object值中。没有理由在存储之前强制转换。
  2. 使用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);除此之外,情况将是相同的。
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/55737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档