gpt4 book ai didi

java - 如何将泛型用于不同类的相似方法

转载 作者:行者123 更新时间:2023-11-30 11:00:40 26 4
gpt4 key购买 nike

有什么方法可以使用一些泛型方法来统一下面类似的方法吗?

public ClassA getInstanceA(String key)
{
if (instanceAMap.contains(key))
{
return instanceAMap.get(key);
}

ClassA result = new ClassA();
instanceAMap.put(key, result);
return result;
}

public ClassB getInstanceB(String key)
{
if (instanceBMap.contains(key))
{
return instanceBMap.get(key);
}

ClassB result = new ClassB();
instanceBMap.put(key, result);
return result;
}

public ClassC getInstanceC(String key)
{
if (instanceCMap.contains(key))
{
return instanceCMap.get(key);
}

ClassC result = new ClassC();
instanceCMap.put(key, result);
return result;
}

所以,我希望所有类都只有一个方法。在 C++ 中它可以被包装成宏,但它如何在 Java 中优雅地完成。

最佳答案

由于泛型类型的类型删除,您无法在运行时创建泛型类型的新实例。

如果您使用的是 Java 8,您可以让该方法采用 Supplier 为您提供一个新对象。这使得调用者有责任创建对象。你可以这样做:

Map<String, Object> map = new HashMap<>();

public <T> T getInstance(String key, Supplier<T> objectSupplier) {
if (instanceAMap.containsKey(key)) {
return (T) map.get(key);
}

T result = objectSupplier.get();
map.put(key, result);
return result;
}

然后您可以像这样调用该方法:

String s = getInstance("String", () -> "Hello World!");

由于未经检查的转换,之后不要这样做:

Integer i = getInstance("String", () -> 5);

它会引发 ClassCastException。

编辑:这是一个为每种类型创建新 map 的版本。

Map<Class<?>, Map<String, ?>> maps = new HashMap<>();

public <T> T getInstance(String key, Class<T> type, Supplier<T> objectSupplier) {

Map<String, T> map;
if (maps.containsKey(type)) {
map = (Map<String, T>) maps.get(type);
} else {
map = new HashMap<>();
maps.put(type, map);
}

if (map.containsKey(key)) {
return map.get(key);
}

T result = objectSupplier.get();
map.put(key, result);
return result;
}

关于java - 如何将泛型用于不同类的相似方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31435430/

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