Question

今天Maven编译的时候,出现如下异常:

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/xx/Documents/Gitrep/xx/manager/src/main/java/com/xx/xx/xx/xxx/xxService.java:[165,49] 不兼容的类型: 推断类型不符合上限
    推断: java.lang.Object
    上限: capture#1, 共 ?,java.lang.Object
[INFO] 1 error

Solution

首先,定位到异常发生的地方。(因为保密的原因,简单的展示下代码)

源代码为:

public <T> T richConetnt(T content ){
  if(null != content ){
     if (content instanceof String) {
        return  (T) ("123" + +(String)content);
     } else if (content instanceof Integer ) {
        return (Integer)content);
     } 
 }

public Object saveToQueue(List<?> contents) {   
   for(Object Content : contents){
    content = rich(content);  
   }      
   return "abc";
 }

修改为

public <T> T richConetnt(T content ){
  if(null != content ){
     if (content instanceof String) {
        return  (T) ("123" + +(String)content);
     } else if (content instanceof Integer ) {
        return (Integer)content);
     } 
 }

public <T> Object saveToQueue(List<T> contents) {   // 注意赋值的类型 ? = T 会导致转换错误 , 所以尽量不要用 ? 表示范型
   for(T Content : contents){
   content = rich(content);  }      
   return "abc";
 }

Reason

  1. 兼容性的问题,从报错可以直接的看出,是范型返回值类型的类型转换错误。
  2. 个人感觉? 最好不要与T进行混用,感觉T更加的规范。
  3. 分析代码可以知道

Reference

[1]. java基础之泛型
[2]. Java总结篇系列:Java泛型
[3]. (知乎)Java instanceof 关键字是如何实现的?
[4]. 泛型推断类型不符合上限

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐