我有以下简短的、自包含的代码,在编译时显示了一个错误。我拼命想把它编出来。我通常对泛型不再有麻烦了,但是我放弃了这个,我请求团队的帮助。
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class CacheWithGenericsDoesNotCompile {
// Class definition can't be modified
static class Resource<T extends Resource<T>> {}
// Class definition can't be modified
static class ResourceType<T extends Resource<T>> {
public ResourceType(Class<T> type) {}
}
// Variable definition may be modified
static LoadingCache<Class<? extends Resource<?>>, ResourceType<? extends Resource<?>>> cache = CacheBuilder.newBuilder().build(
new CacheLoader<Class<? extends Resource<?>>, ResourceType<? extends Resource<?>>>() {
@Override public ResourceType<? extends Resource<?>> load(Class<? extends Resource<?>> key) throws Exception {
return new ResourceType<? extends Resource<?>>(key);
}
});
// Method definition can't be modified, method content may.
@SuppressWarnings("unchecked")
static <T extends Resource<T>> ResourceType<T> getResourceType(Class<T> type) {
return (ResourceType<T>)cache.getUnchecked(type);
}
}
编译失败的行是:
return new ResourceType<? extends Resource<?>>(key);
我知道为什么它失败了:我可能不写带问号的new Xxxx<...>
(?
)。我只是不能用不同的方式写这行来让其他行编译。
在Resource
没有泛型的情况下,我有一个后备解决方案,但在可能的限制下,我想保持Resource
具有泛型。
我对LoadingCache
的泛型没有任何限制,除了我需要像getResourceType(Class)
一样调用它。
所以…我如何修复这个代码?
带有一些被忽略的警告的解决方案:
static LoadingCache<Class<? extends Resource<?>>, ResourceType<? extends Resource<?>>> cache = CacheBuilder.newBuilder().build(
new CacheLoader<Class<? extends Resource<?>>, ResourceType<? extends Resource<?>>>() {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override public ResourceType<? extends Resource<?>> load(Class<? extends Resource<?>> key) throws Exception {
return new ResourceType(key);
}
});
正如@John B在评论中建议的。由于类型擦除,该代码在运行时与问题中的代码没有什么不同。
我玩了更多关于gontard的解决方案(所以如果你给这个投票,一定要给gontard的答案投票)和millimoose的评论。我采用了这个解决方案,它完全删除了泛型,以获得更具可读性的代码。
@SuppressWarnings("rawtypes")
static LoadingCache<Class, ResourceType> cache = CacheBuilder.newBuilder().build(
new CacheLoader<Class, ResourceType>() {
@SuppressWarnings("unchecked")
@Override public ResourceType load(Class key) throws Exception {
return new ResourceType(key);
}
});
如果我们可以将key
转换为合适的类型
Class<T> for some T that T<:Resource<T>
那么我们写
就没有问题了ResourceType<? extends Resource<?>> result = new ResourceType<>(casted_key)
通常这种类型的强制转换可以通过通配符捕获来完成,但是如果类型变量有一个自引用绑定,它就不起作用了。请参阅泛型和Class>, EnumSet.allOf(class) vs class. getenumconstants()。
相关内容
- 当ttl到达时,Guava缓存是如何实现删除键的?
- 清除/清除Guava缓存中所有空值的最佳方法是什么
- 当缓存加载失败时,Guava缓存会用另一个线程重试缓存加载吗
- Guava缓存为Flink中的ValueState
- JAVA Guava缓存刷新现有元素
- Guava缓存异步重新加载
- Guava缓存键是复合的,需要按第一个键查询并得到一个列表
- 如何实现Guava缓存来存储和获取不同类型的对象
- 如何使用Guava缓存HTTP响应?(没有螺纹堵塞)
- 为什么 Spring 框架不推荐使用 Guava 缓存
- 实施一个Guava缓存以永远持续
- 如何释放Guava缓存对象
- Guava缓存ASMAP方法
- 在Guava缓存中查找间隔中的记录
- 如何每隔30秒清空Guava缓存,同时将其发送到另一种方法
- Google guava缓存invalidateAll()和clearup()之间的差异
- 空的Guava缓存大小
- guava缓存与ehcache基准测试
- Guava缓存:通过删除策略进行手动管理
- 如何处理Google Guava缓存刷新异常
最新更新
- 在批处理脚本中替换而不是添加前缀
- 如果类没有初始化,c++编译器会生成一个defctor吗?
- 在我的代码中没有得到任何方程的答案,我的按钮进入我的字段
- vsto Outlook插件在Outlook 2016和Office 365中的行为不同
- npm install不会在我的React项目中安装任何node模块
- 用两次检查遍历两个列表
- 将图像转换为RGB格式的文本文件,格式为三逗号分隔
- 我正试图找到一种方法将TimeSpan变量转换为秒的整数量
- FCM云消息传递验证令牌
- C多重间接
- 显示数组中元素的倒计时。setInterval 不会导致延迟。最后一个元素立即显示
- sveltekit:等待来自+服务器的数据.t加载函数
- JQuery是:检查每次点击返回两个值
- RxJS中具有共享结果的请求队列
- Beautifulsoup如何添加一些东西到列,如果元素没有显示
- 在Jekyll blog中按2D位置(距离)搜索
- Robocopy在复制过程中向文件名添加日期
- c -间接递归的用例
- 如何将日期对象转换为格式(DD-MM-YYYY)
- 如何从没有使用python硒链接的网站下载文件?
- 用错误处理循环捕获用户输入的最佳方法
- 如何使用内部连接在php发送值从下拉菜单到数据库的两个不同的表
- 我如何得到一个状态的IISreset - true,如果它是启动和false,如果它是停止
- 如何复制列标题"Testing"的列
- 读取文件夹中的多个DOCX文件到多个dataframe时出错
- 无法下载InceptionV3 Keras
- 如何打印数据在模板django的一个不同的表由外键连接?
- 动态导航菜单超时功能未清除
- 如何使用EPPlus 6.1.3将图表系列分配到辅助Y轴?
- 如何使用R来合并冗余信息?
热门标签:
javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium