我需要创建一个泛型对象的Java缓存。我正在尝试执行以下操作,但此操作无法编译。
public class Example<T> {
public static class ExampleCache {
private Map<String, Example<?>> cache = new ConcurrentHashMap<>();
public <T> Example<T> getExample(String name) {
return cache.computeIfAbsent(name, k -> new Example<T>());
}
}
}
包含cache.computeIfAbsent的行将生成错误
"Error:(16, 35) java: incompatible types: Example<capture#1 of ?> cannot be converted to Example<T>
有什么建议吗?
发布于 2018-07-30 02:56:01
您尝试做的事情不是类型安全的。
您可以将?
强制转换为T
,但这不是类型安全的:
return (Example<T>) cache.computeIfAbsent(name, k -> new Example<T>());
您希望getExample()
的客户端决定返回的Exemple
实例的泛型类型。
假设您添加了条目"hello"-"Example<String>"
,并且客户端以这样的方式调用getExample()
:Example<Integer> example : getExample("hello");
,他/她将具有不正确的泛型类型,并且可能在运行时引发一些不一致/异常。
事实上,ExampleCache
对于作为输入/输出的泛型类型并不一致。
因此,要么将通配符替换为T
以定义特定类型的ExampleCache
,要么像在client类中那样在缓存中仅使用Example<?>
,或者仍然不对Example
类使用泛型。
https://stackoverflow.com/questions/51583456
复制相似问题