1
Renco OP |
2
Renco OP |
3
Renco OP 为啥这样写,返回的值默认是 Object ,而不是参数中的 EqpProdInfo 类。
|
4
Renco OP 泛型平时用的比较少,这次写新功能的时候,尝试用用,遇上了这个错。
|
5
tars13344 10 天前
看你 getKey 方法的 tclass 参数也没有用到,如果只是想用来指定返回值类型的话 是不需要这个参数的,在调用的时候直接 cache.<EqpProdInfo>getIfPresent() 就可以了
|
9
w11ya 10 天前
泛型擦除
|
10
ftsland 10 天前
你是想 Cache 里面 Value 可以保存任意类型吗?
![这是图片 1]( https://meee.com.tw/R8cfkNx "这是图片 1") ![这是图片 2]( https://meee.com.tw/KLKSVhy "这是图片 2") |
11
ftsland 10 天前
MD 不知道为啥发不出来, 如果需要 Cache 里面是任意类型, 不要使用 CacheHelper<K, V> , 使用 CacheHelper<K> , Cache 用 Cache<K,Object> getByKey 去掉 class 参数,
|
13
bli22ard 10 天前
建议
public <T extends V> T get(String cacheKey,K key){ Cache<K,V> cache=cacheMap.get(cacheKey); if(cache!=null){ return (T) cache.get(key); } return null; } 你是要限定 V 的类型范围,因为你已经限定了 cache 的 value 是个 V 类型。传 Class<T> clazz , 那你的 V 类型还不如直接定义为 Object 。另外你的成员变量 cacheMap 会有并发安全问题,当然如果 CacheHelper 不会有并发问题,那可以忽略并发安全问题 |
14
xiangbohua 10 天前
好像不是因为范形擦除的原因,我觉得还是因为类上面定义的类型是 V ,但是方法上传的是 T ,T 和 V 之间又没有范性约束那么直接理解为两个不相关的类就好了。既然不相关,那编译器只能认为返回的是 object (拿不到任何类型限定信息)。
如果有错误可指出 |
15
ajieggoto318 10 天前
如果 T 是 V 的父类可以把 getByKey 方法的<T>改为<T super V>,然后代码好像没有问题,重启一下 idea ,看看是不是 idea 抽风了
|
16
jaredyam 10 天前
看起来是 IDEA 缓存的问题
|
17
yazinnnn0 10 天前
|
18
635925926 10 天前
把 T 换成 V
|
19
ychost 10 天前
应该是 IDEA 的问题,清空缓存重试下,
|
20
dragondove 10 天前
@yazinnnn0 根据返回类型实际上是放弃类型安全,不过可以通过其他方式补全(比如楼主用的 Class<T>的方式,但是 Class<T> 存在 T 不能有泛型的限制,都是历史债,建议是自己定义一个 TypeInfo 之类的类型来使用),下面的例子是 java 中根据返回类型推断泛型的例子,java 在这方面不存在你说的问题。
```java public class Main { static Object o = new Object(); @SuppressWarnings("unchecked") static <T> T get() { return (T) o; } public static void main(String[] args) { String x = get(); } } ``` |
21
entrance 10 天前
cacheHelper 注入时没指定泛型类型,可以试下这样: cacheHelper<String, List<String>> cacheHelper
|
23
ChenFanlin 10 天前
简单写了个小 demo 试了下,好像也没报错?
``` public class Test { public static void main(String[] args) { Helper<String, Integer> helper = new Helper<>(); Key key = helper.getByKey("", "", Key.class); System.out.println(key); } private static class Key { } private static class Helper<K, V> { public <T> T getByKey(String cacheKey, K key, Class<T> tClass) { return null; } } } ``` |
24
levintrueno 10 天前
看看你的 cacheHelper 注入的时候是怎么定义的,如果 key 都是 String ,那么可以 @Resource CacheHelper<String, ?> cacheHelper; 那个 vClass 参数也可以不用了,应该可以直接返回你定义的类型。
|