gpt4 book ai didi

java - 由于 Java 泛型,我无法编译 Guava 的缓存构建器

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:49:49 25 4
gpt4 key购买 nike

我有以下简短的自包含代码,在编译时显示错误。我拼命地试图让它编译。我通常不会再遇到泛型问题,但好吧,我放弃了这个,我请求团队的帮助。

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 的建议在评论中。由于 type-erasure,此代码在运行时 与问题中的代码没有区别.

关于java - 由于 Java 泛型,我无法编译 Guava 的缓存构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15382520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com