次の短い自己完結型のコードがあり、コンパイル時にエラーが表示されます。私は必死にそれをコンパイルさせようとしました。私は通常、ジェネリック医薬品に問題はありませんが、これをあきらめて、チームの助けを求めます。
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)
。
だから...どうすればこのコードを修正できますか?