我有以下简短的自包含代码,它在编译时显示错误。我拼命尝试编译它。我通常不再对泛型有任何疑问,但是我放弃了这一点,并且请求团队的帮助。由于Java泛型,我无法编译Guava的Cache构建器
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)
中调用该泛型。
那么......我该如何解决这个问题?
啊,我所缺少的是递归边界('T extends Resource')被通配符捕获的局限性所迷失,这就是为什么我的答案不起作用。 –
2013-03-13 12:23:10