繁体   English   中英

地图中的动态模板依赖性

[英]Dynamic template dependency in a map

我不太确定如何表达我的问题,所以我举一个例子:

以这张地图为例:

Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;

例如,它将将DatabaseEntry扩展到其IDecorator<MyClass> MyClass映射。 上述声明的问题在于,它过于明确。 我想要更多的类型安全性。 像这样:

Map<Class<T extends DatabaseEntry>, Class<? extends IDecorator<T>>> map;

当然,T随条目的不同而不同,但是我想要的是如果我打电话给我:

map.get(MyClass.class);

返回类型将是IDecorator<MyClass>而不是IDecorator<? extends DatabaseEntry> IDecorator<? extends DatabaseEntry>

有一个简单的解决方案吗?

正如@zaske在他的回答中已经指出的那样,这似乎是不可能的。

按照您已经在考虑的思路,您可以将Map封装在一个类中,该类提供所需的通用getput方法。

public class MapWrapper { 

    Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;
    public <T extends DatabaseEntry> Class<IDecorator<T>> put (Class<T> k, Class<IDecorator<T>> v){
        return (Class<IDecorator<T>>) map.put(k,v);
    }

    public <T extends DatabaseEntry> Class<IDecorator<T>> getObject(Class<T> k) {
        return (Class<IDecorator<T>>) map.get(k);
    }
}

据我所知-没有办法做到这一点。
您当然不能使用T,T必须是通用定义的一部分,
并且不能在这样的变量的独立定义中使用,这就是通配符(?)的目的。
由于您的地图正在使用Class的键和值对象
您甚至不能通过简单地扩展键和值的类型来解决此问题(因为Class是最终的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM