我想要这样的东西来编译:
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);
}
}
有可能吗?
答案 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