当前位置: 首页 > 面试题库 >

是否可以将两个通配符类型声明为相同类型?

易骁
2023-03-14
问题内容

我想创建一个从(a)类类型到(b)long(已定义类类型的对象的标识符)到(c)对象本身的映射。

我有以下内容:

 protected HashMap<Class<?>, HashMap<Long, ?>> obj = new HashMap<Class<?>, HashMap<Long, ?>>();

是否有可能以某种方式表示第一个?必须与第二个具有相同的类型??我期待这样的事情,但这当然是不可能的:

protected <T> HashMap<Class<T>, HashMap<Long, T>> obj = new HashMap<Class<T>, HashMap<Long, T>>();

问题答案:

作为替代方案,您可以使用少量的非类型安全代码以强制执行约束的方式封装:

class Cache {
    private Map<Class<?>, Map<Long, ?>> items = new HashMap<Class<?>, Map<Long, ?>>();

    private <T> Map<Long, T> getItems(Class<T> type) {
        @SuppressWarnings("unchecked")
        Map<Long, T> result = (Map<Long, T>) items.get(type);
        if (result == null) {
            result = new HashMap<Long, T>();
            items.put(type, result);
        }
        return (Map<Long, T>) result;
    }

    public <T> void addItem(Class<T> type, Long id, T item) {
        getItems(type).put(id, item);
    }

    public <T> T getItem(Class<T> type, Long id) {
        return type.cast(getItems(type).get(id));
    }
}

type.cast()getItem()不需要编译器不会抱怨,但它会帮助赶上了错误的类型进入缓存早期的对象。



 类似资料:
  • 问题内容: 我尝试将机器人抓取器的位置映射到抓取器所握持的物体所施加的阻力。我预订了一个主题的抓取器位置,又订阅了另一个主题的阻力值,因为我想确保抓取器位置与该位置的确切阻力值相对应。鉴于两者都是浮动消息,如何同步它们? 问题答案: 您可以在中使用。 这是一个订阅多个主题以同时获取数据的示例: 如果您的问题没有解决,则不是: 阅读更多

  • 本文向大家介绍我可以将JavaScript变量声明为特定类型吗?,包括了我可以将JavaScript变量声明为特定类型吗?的使用技巧和注意事项,需要的朋友参考一下 JavaScript变量没有类型。值具有类型。这是声明JavaScript变量的方式- 你仍然可以这样写- 正如您在上面看到的那样,在变量声明中指定类型没有任何好处。这是因为类型由变量的值决定。

  • 问题内容: 假设我有一个类A,而B,C,D是从A派生的。 如果我想知道所引用的对象的类型是什么,可以声明: 这是因为我确定从A派生的类只有B,C和D。 但是,如果我只想检查两个引用是否指向同一种对象,该怎么办? 所以像这样: 但是当然语法是错误的,如何在没有1000 if-else的情况下进行检查? 问题答案: 你的意思是 即使和属于相同的特定类,也应返回true 。 但是,如果与进行比较,则此方

  • 问题内容: 一般情况下,我无法优雅地获取图像像素作为数组。 现在,功能getPixels如下所示: 但是我认为这很丑。Golang知道图像的类型,我希望这样: 我也不能坚持。也许有一种方法可以从接口获取类型? 问题答案: 通过使用如下所示的类型开关,可以简化大型结构: 您仍然必须列出所有可能的类型,但这更好。 由于所有图像实现都是具有名为的字段的结构指针,因此您可以使用反射来获取该字段。此实现将处

  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。