gpt4 book ai didi

java - 创建一个映射,其值作为泛型类型,并且能够在从映射中检索后对值进行操作

转载 作者:行者123 更新时间:2023-12-01 19:54:11 25 4
gpt4 key购买 nike

有类存储库为

public class Repository<T> {


public void add(T t){

}
}

另一个类 RepoHolder 定义为

public class RepoHolder {


private Map<String, Repository<?>> repoMap = new HashMap<String, Repository<?>>();

public Repository<?> getRepo(String type){
return repoMap.get(type);
}


public void registerRepo(String repoType,Repository<?> repo){
repoMap.put(repoType, repo);
}

}

我想执行以下操作:

    Repository<String> repo = new Repository<String>();
holder.registerRepo("mykey", repo);
Repository<?> repo1 = holder.getRepo("mykey");
//below doesn't compile
repo1.add("fdfd");

上面的代码片段无法编译。我怎样才能实现这个用例?

最佳答案

这些行:

Repository<?> repo1 = holder.getRepo("mykey");
repo1.add("fdfd");

显然类型不正确:您正在尝试输入 String变成你不知道参数类型应该是什么的东西。它可能Repository<String> ,但也可以是 Repository<Integer> (或 Repository<AnythingElse> )。

这里“明显”的修复是使 getRepo通用:

public <T> Repository<T> getRepo(String type){  
return (Repository<T>) repoMap.get(type);
}

因为这样你就可以写:

Repository<String> repo1 = holder.getRepo("mykey");
repo1.add("fdfd");

但是不要这样做,因为你同样可以这样写

Repository<Integer> repo1 = holder.getRepo("mykey");
repo1.add(123);

它会在运行时失败。

您需要一些方法将类型与存储库关联起来。

例如,您可以将附加参数传递给 getRepo :

public <T> Repository<T> getRepo(String type, Class<T> clazz)

然后在该方法中添加逻辑以确保 type 标识的存储库实际上是“Repository<clazz> ”的一个实例。

例如,您可以更改存储库持有者类中的映射以也考虑该类:

private Map<Class<?>, Map<String, Repository<?>>> repoMap = new HashMap<>();

即您可以拥有具有相同字符串键的多个存储库,因为它们由 (Class, String) 标识。一对。

或者,您可以输入:

interface RepositoryKey<T> {
// ...
}

当您一个元素放入支架时,您会得到一个键入的 key :

public <T> RepositoryKey<T> registerRepo(String repoType,Repository<T> repo){
RepositoryKey<T> key = ...
repoMap.put(key, repo);
return key;
}

现在您可以使用 key 以类型安全的方式检索它:

Repository<String> repo = new Repository<String>();
RepositoryKey<String> key = holder.registerRepo("mykey", repo);

Repository<String> repo1 = holder.getRepo(key);
repo1.add("fdfd");
<小时/>

请注意,Effective Java 中对此有一个条目:“考虑类型安全的异构容器”。这是第二版的第 29 项。您应该阅读该内容以了解更多详细信息。

关于java - 创建一个映射,其值作为泛型类型,并且能够在从映射中检索后对值进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50130049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com