是否可以绑定嵌套泛型?
是否可以将嵌套泛型/捕获绑定在一起?
我经常遇到这样的问题:将类映射到所述类的泛化项。具体来说,我想要这样的东西(不, T 没有在任何地方声明)。
private Map<Class<T>, ServiceLoader<T>> loaders = Maps.newHashMap();
简而言之,我希望 loaders.put/get 具有如下语义:
<T> ServiceLoader<T> get(Class<T> klass) {...}
<T> void put(Class<T> klass, ServiceLoader<T> loader) {...}
以下是我能做的最好的事情吗?我是否必须忍受不可避免的 @SuppressWarnings("unchecked")
?
private Map<Class<?>, ServiceLoader<?>> loaders = Maps.newHashMap();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
让我看看如果我明白你的意图:你想要一个存储成对的
Class
/ServiceLoader
的映射,其中每对都由相同的T
参数化,但是T
之间可能会有所不同?如果是这种情况,那么最好的解决方案是声明您自己的类,它将展示这样的接口。在内部,它将这些对存储在通用
Map,ServiceLoader>
映射中。@SuppressWarnings("unchecked")
注释并不是纯粹的邪恶。您应该尽量避免它们,但在某些情况下,您可以发现强制转换是正确的,尽管编译器无法看到这一点。Let me see If I got your intention: you want a map that stores pairs of
Class
/ServiceLoader
where each pair is parameterized by the sameT
, butT
may be different across pairs?If this is the case then the best solution is to declare your own class which will exhibit such an interface. Internally it will store these pairs in a generic
Map<Class<?>,ServiceLoader<?>>
map.@SuppressWarnings("unchecked")
annotations are not pure evil. You should try to avoid them but there are certain cases where you can figure out that the cast is correct despite the fact that the compiler cannot see that.我的建议是为这种情况创建一个新对象。我看到您正在使用
Maps.newHashMap()
,所以我认为您使用了 Google Guava,所以我将使用ForwardingMap
。一个简单的测试证明我的建议是有效的:
My suggestion is to create a new Object for such case. I see you were using
Maps.newHashMap()
so I take it that you used Google Guava so I will useForwardingMap
.A simple test proved that my suggestion is working: