
1 Renco OP |
2 Renco OP |
3 Renco OP 为啥这样写,返回的值默认是 Object ,而不是参数中的 EqpProdInfo 类。 |
4 Renco OP 泛型平时用的比较少,这次写新功能的时候,尝试用用,遇上了这个错。 |
5 tars13344 2024-12-11 11:16:05 +08:00 看你 getKey 方法的 tclass 参数也没有用到,如果只是想用来指定返回值类型的话 是不需要这个参数的,在调用的时候直接 cache.<EqpProdInfo>getIfPresent() 就可以了 |
6 tars13344 2024-12-11 11:17:30 +08:00 |
7 tars13344 2024-12-11 11:23:00 +08:00 @tars13344 #5 ...这个符号是打不出来了,总之就是在调用函数的时候 在函数名和. 之间用尖括号包围指定 T 的类型即可 /td> |
9 w11ya 2024-12-11 11:28:41 +08:00 泛型擦除 |
10 ftsland 2024-12-11 11:40:02 +08:00 你是想 Cache 里面 Value 可以保存任意类型吗?   |
11 ftsland 2024-12-11 11:43:00 +08:00 MD 不知道为啥发不出来, 如果需要 Cache 里面是任意类型, 不要使用 CacheHelper<K, V> , 使用 CacheHelper<K> , Cache 用 Cache<K,Object> getByKey 去掉 class 参数, |
13 bli22ard 2024-12-11 11:49:01 +08:00 建议 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 2024-12-11 11:57:03 +08:00 好像不是因为范形擦除的原因,我觉得还是因为类上面定义的类型是 V ,但是方法上传的是 T ,T 和 V 之间又没有范性约束那么直接理解为两个不相关的类就好了。既然不相关,那编译器只能认为返回的是 object (拿不到任何类型限定信息)。 如果有错误可指出 |
15 ajieggoto318 2024-12-11 12:13:38 +08:00 如果 T 是 V 的父类可以把 getByKey 方法的<T>改为<T super V>,然后代码好像没有问题,重启一下 idea ,看看是不是 idea 抽风了 |
16 jaredyam 2024-12-11 15:43:23 +08:00 看起来是 IDEA 缓存的问题 |
17 yazinnnn0 2024-12-11 15:48:10 +08:00 |
18 635925926 2024-12-11 16:53:39 +08:00 把 T 换成 V |
19 ychost 2024-12-11 16:59:12 +08:00 应该是 IDEA 的问题,清空缓存重试下, |
20 dragondove 2024-12-11 17:11:07 +08:00 @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 2024-12-11 18:07:14 +08:00 cacheHelper 注入时没指定泛型类型,可以试下这样: cacheHelper<String, List<String>> cacheHelper |
23 ChenFanlin 2024-12-11 19:34:54 +08:00 简单写了个小 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 2024-12-12 09:09:23 +08:00 看看你的 cacheHelper 注入的时候是怎么定义的,如果 key 都是 String ,那么可以 @Resource CacheHelper<String, ?> cacheHelper; 那个 vClass 参数也可以不用了,应该可以直接返回你定义的类型。 |