类是否可以使用Class对象作为键的map属性,以及具有该类对象列表的值?

时间:2015-08-27 01:16:17

标签: java generics

我想要这样的东西来编译:

public class RepositoryService {
   public Map<Class<? extends T>, List<T>> repository;

   public RepositoryService() {
      repository = new HashMap<>(); // doesn't matter which implementation
      repository.put(Integer.class, Arrays.asList(1, 2, 3));
      repository.put(String.class, Arrays.asList("A", "B", "C"));
   }

   public List<T> get(Class clazz) {
     return repository.get(clazz);
   }
}

有可能吗?

3 个答案:

答案 0 :(得分:1)

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class RepositoryService {

   private Map<Class<?>, List<?>> repository;

   public RepositoryService() {
      repository = new HashMap<>();
      repository.put(Integer.class, Arrays.asList(1, 2, 3));
      repository.put(String.class, Arrays.asList("A", "B", "C"));
   }

   @SuppressWarnings("unchecked")
   public <T> List<T> get(Class<T> clazz) {
      return (List<T>) repository.get(clazz);
   }

   public static void main(String[] args) {
      RepositoryService repositoryService = new RepositoryService();
      List<Integer> integers = repositoryService.get(Integer.class);
      List<String> strings = repositoryService.get(String.class);
      System.out.println(integers);
      System.out.println(strings);
   }

}

这就是诀窍。当然,没有办法确定调用get(Class<T>)会在运行时之前返回真正的List<T>,但似乎是班级负责人添加列表我不认为会是一个问题。

答案 1 :(得分:0)

假设在运行时永远不会更改值列表,您可以做的另一件事是使用枚举。

public enum RepoEnum {

INTEGER(Integer.class,  Arrays.asList(1, 2, 3)),
STRING(String.class,  Arrays.asList("A", "B", "C"));

private Class clazz;
private List values;

RepoEnum(Class clazz, List values){
    this.clazz = clazz;
    this.values = values;
}

public static List get(Class clazz) {
    for (RepoEnum item : RepoEnum.values()) {
        if (item.getClazz().equals(clazz)) {
            return item.getValues();
        }
    }
    return null;
}
//getters and setters
}

答案 2 :(得分:0)

让Java本身保持这样的数据完整性并不安静,因为泛型类型在运行时被擦除。但是为什么不扩展<div class="panel_out">类并通过自己的代码维护类型约束呢?像

这样的东西
Map