我有以下簡短的自包含代碼,它在編譯時顯示錯誤。我拼命嘗試編譯它。我通常不再對泛型有任何疑問,但是我放棄了這一點,並且請求團隊的幫助。由於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