类型安全的异构容器

风来了 风来了     2022-08-12     737

关键词:

原文:http://gafter.blogspot.com/2006/12/super-type-tokens.html

1. 泛型通常用于集合,如Set和Map等。这样的用法也就限制了每个容器只能有固定数目的类型参数,一般来说,这也确实是我们想要的。

然而有的时候我们需要更多的灵活性,如数据库可以用任意多的Column,如果能以类型安全的方式访问所有Columns就好了,幸运的是

有一种方法可以很容易的做到这一点,就是将key进行参数化,而不是将容器参数化,见以下代码

 1 public class Favorites {
 2     private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>();
 3     public <T> void setFavorite(Class<T> klass, T thing) {
 4         favorites.put(klass, thing);
 5     }
 6     public <T> T getFavorite(Class<T> klass) {
 7         return klass.cast(favorites.get(klass));
 8     }
 9     public static void main(String[] args) {
10         Favorites f = new Favorites();
11         f.setFavorite(String.class, "Java");
12         f.setFavorite(Integer.class, 0xcafebabe);
13         String s = f.getFavorite(String.class);
14         int i = f.getFavorite(Integer.class);
15     }
16 }

 

2.不足之处

There is a limitation to this pattern. Erasure rears its ugly head:

Favorites:15: illegal start of expression
f.setFavorite(List<String>.class, Collections.emptyList());

 

3.改进

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * References a generic type.
 *
 * @author [email protected] (Bob Lee)
 */
public abstract class TypeReference<T> {

    private final Type type;
    private volatile Constructor<?> constructor;

    protected TypeReference() {
        Type superclass = getClass().getGenericSuperclass();
        if (superclass instanceof Class) {
            throw new RuntimeException("Missing type parameter.");
        }
        this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
    }

    /**
     * Instantiates a new instance of {@code T} using the default, no-arg
     * constructor.
     */
    @SuppressWarnings("unchecked")
    public T newInstance()
            throws NoSuchMethodException, IllegalAccessException,
                   InvocationTargetException, InstantiationException {
        if (constructor == null) {
            Class<?> rawType = type instanceof Class<?>
                ? (Class<?>) type
                : (Class<?>) ((ParameterizedType) type).getRawType();
            constructor = rawType.getConstructor();
        }
        return (T) constructor.newInstance();
    }

    /**
     * Gets the referenced type.
     */
    public Type getType() {
        return this.type;
    }

    public static void main(String[] args) throws Exception {
        List<String> l1 = new TypeReference<ArrayList<String>>() {}.newInstance();
        List l2 = new TypeReference<ArrayList>() {}.newInstance();
    }
}

 

本周小贴士#144:关联容器中的异构查找(代码片段)

...器中查找元素需要等效键。通常,容器要求键是特定类型的,这会导致调用处的效率低下,需要在接近等效的类型(如std::string和absl::string_view)之间进行转换。为了避免这种不 查看详情

本周小贴士#144:关联容器中的异构查找(代码片段)

...器中查找元素需要等效键。通常,容器要求键是特定类型的,这会导致调用处的效率低下,需要在接近等效的类型(如std::string和absl::string_view)之间进行转换。为了避免这种不 查看详情

模型数据库中的异构类型

】模型数据库中的异构类型【英文标题】:ModelHeterogeneousTypeinDatabase【发布时间】:2009-02-0313:53:39【问题描述】:我正在尝试找出在我的系统中为一组“类”建模的最佳方法。请注意,我不是在谈论OO类,而是响应类(在调查中... 查看详情

swift中的异构集合文字

】swift中的异构集合文字【英文标题】:Heterogeneouscollectionliteralinswift【发布时间】:2018-10-1821:26:07【问题描述】:我正在尝试按如下方式读取嵌套数组,但出现错误。varinputArray=[1,[4,3],6,[5,[1,0]]]funcnestedArray(inputArray:[Any])错误:异... 查看详情

深度学习的异构加速技术:螺狮壳里做道场

...云、高速视觉感知等方向的构架设计和优化。“深度学习的异构加速技术”系列共有三篇文章,主要在技术层面,对学术界和工业界异构加速的构架演进进行分析。一、综述在“深度学习的异构加速技术(一)”一文所述的AI加... 查看详情

朴素贝叶斯:观察变量的异构 CPD

】朴素贝叶斯:观察变量的异构CPD【英文标题】:NaiveBayes:HeterogeneousCPDsforobservationvariables【发布时间】:2015-04-2208:27:14【问题描述】:我正在使用一个朴素贝叶斯模型进行二元分类,并结合使用离散变量和连续变量。我的问题是... 查看详情

云边端一体化的异构ai计算

...主要介绍阿里云AI异构计算编译框架HALO以及面向深度学习的异构硬件统一接口规范ODLA,通过具体的实例说明如何利用异构编译和硬件架构抽象实现上层应用在异构计算资源上的平滑迁移。后半部分介绍ODLA.CV(多媒体Pi 查看详情

NSArrayControllers 和 Core Data 对象的异构数组

】NSArrayControllers和CoreData对象的异构数组【英文标题】:NSArrayControllersandheterogeneousarraysofCoreDataobjects【发布时间】:2011-06-2014:39:22【问题描述】:我正在尝试创建一个MacOSCoreData应用程序,该应用程序具有一组父对象(称为级别)... 查看详情

深度学习的异构加速技术:ai需要一个多大的“心脏”?

...云、高速视觉感知等方向的构架设计和优化。“深度学习的异构加速技术”系列共有三篇文章,主要在技术层面,对学术界和工业界异构加速的构架演进进行分析。一、概述:通用=低效作为通用处理器,CPU(CentralProcessingU 查看详情

如何对可变参数模板函数的异构参数包进行通用计算?

】如何对可变参数模板函数的异构参数包进行通用计算?【英文标题】:Howtomakegenericcomputationsoverheterogeneousargumentpacksofavariadictemplatefunction?【发布时间】:2012-12-2500:47:21【问题描述】:前提:在尝试了一些可变参数模板之后,我... 查看详情

如何处理存储库模式中的异构数据源?

】如何处理存储库模式中的异构数据源?【英文标题】:Howtodealwithheterogeneousdatasourcesinrepositorypattern?【发布时间】:2022-01-2109:51:58【问题描述】:假设您想实现一个存储库模式来处理应用程序的数据。映像您有两个数据源:本地... 查看详情

如何使用基于字段值选择的异构委托制作 QtQuick TableView / TreeView

】如何使用基于字段值选择的异构委托制作QtQuickTableView/TreeView【英文标题】:howtomakeQtQuickTableView/TreeViewwithheterogeneousdelegatechosenbasedonfieldvalue【发布时间】:2020-04-0814:51:30【问题描述】:如何根据另一个单元格的值选择单元格委... 查看详情

C++如何创建异构容器

...value)的形式存储一系列数据点,其中的值可以采用不同的类型。我正在尝试为每个数据点使用一个类模板。然后对于我看到的每个数据点,我想创建一个新对象并将其推回向量中。对于每种新类型,我需要先从模板创建一个新类... 查看详情

基于ga遗传算法的异构网络垂直切换优化算法的matlab仿真

目录一、理论基础二、案例背景1.问题描述2.思路流程三、MATLAB核心代码 查看详情

华为云ugo:醒醒!你的异构数据库迁移难题有救了

摘要:华为云推出的数据库和应用迁移UGO,正是一款专注于异构数据库结构迁移和应用SQL转换的专业云服务。数字化时代下,上云已成为企业管理者的基本共识,随着技术日新月异,上云也变得轻松简单起来,但异构数据库迁移... 查看详情

您如何定义具有异构值类型的 QHash?

】您如何定义具有异构值类型的QHash?【英文标题】:HowdoyoudefineaQHashwithheterogeneousvaluetypes?【发布时间】:2014-08-1900:17:34【问题描述】:我需要有一个QHash容器,它接受quint8键但将异构类型作为值,所有这些都是Qt容器或类。例如... 查看详情

一种基于结构信息检索文档的思路(html,pdf,html,xml,doc,ppt,这样的异构文档应该如何检索呢?)

文章大纲1.背景2.文档结构信息的构建2.1异构文档结构信息基础库初始化2.1.1.交互信息设置与基础领域词库构建结构信息提取异构文档的向量化文档结构信息库异构文档检索异构文档检索流程技术效果附录--通用算法TF-IDF(termfrequ... 查看详情

为什么说datax是目前最好的异构数据源数据交换工具(代码片段)

本文收录于JavaStarter,里面有我完整的Java系列文章,学习或面试都可以看看(一)什么是Datax以前我做过一个项目,其中有个需求就是每天定时把sqlserver中的数据同步到Mysql中,当时写了一段Java的代码来实... 查看详情