我有以下简短的自包含代码,在编译时显示错误。我拼命地试图让它编译。我通常不再遇到泛型问题,但是我放弃了这个,我请求团队的帮助。
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)
.
那么...我该如何修复此代码?