是否可以绑定嵌套泛型?

Mic*_*uff 3 java generics capture

是否可以将嵌套的泛型/捕获绑定在一起?

我经常遇到将类的Map查找到所述类的泛化项的问题.具体而言,我想要这样的东西(不,T没有在任何地方声明).

private Map<Class<T>, ServiceLoader<T>> loaders = Maps.newHashMap();
Run Code Online (Sandbox Code Playgroud)

简而言之,我希望loaders.put/get具有类似这样的语义:

<T> ServiceLoader<T> get(Class<T> klass) {...}
<T> void put(Class<T> klass, ServiceLoader<T> loader) {...}
Run Code Online (Sandbox Code Playgroud)

以下是我能做的最好的事情吗?我是否必须忍受不可避免的@SuppressWarnings("unchecked")某个地方?

private Map<Class<?>, ServiceLoader<?>> loaders = Maps.newHashMap();
Run Code Online (Sandbox Code Playgroud)

Ita*_*man 6

让我看看如果我有你的意图:你想要一个存储成对的地图Class/ ServiceLoader每个对被参数化的地方T,但是T对可能是不同的?

如果是这种情况,那么最好的解决方案是声明自己的类,它将展示这样的接口.在内部,它会将这些对存储在通用Map<Class<?>,ServiceLoader<?>>映射中.

public class MyMap {
   private Map<Class<?>, ServiceLoader<?>> loaders 
      = new HashMaps<Class<?>, ServiceLoader<?>>();

   public<T> void put(Class<T> key, ServiceLoader<T> value) {
      loaders.put(key, value);
   }

   @SuppressWarnings("unchecked")
   public<T> T get(Class<T> key) { return (ServiceLoader<T>) loaders.get(key); }
}
Run Code Online (Sandbox Code Playgroud)

@SuppressWarnings("unchecked")注释不是纯粹的邪恶.您应该尽量避免使用它们,但在某些情况下您可以确定转换是正确的,尽管编译器无法看到它.