开发者社区> 问答> 正文

方法返回值类型不匹配?报错

public List<Object> initData() {
    List<String> stringList = new ArrayList<>();
    return stringList;
}
public Object tt() {
    String s = "1";
    return s;
}

为啥上边这种就报错类型不匹配,下边这么写就不报错?

展开
收起
爱吃鱼的程序员 2020-06-06 20:27:01 545 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p><strong>方法 1 </strong> List<Object> initData() {...} <br>
    

    就Java 语言而言,所有的类都隐式继承 Object,即 Object 类位于继承树最顶层,是所有其它类的基(父)类。 
    泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
    方法 1 规定调用此方法将返回一个List ,其元素类型是 Object 。换句话说,返回的 List 之中的元素类型,可以是 Object,或 Object 的子类,即 可以是Java任何一个类的对象(实体)。
    可是,此方法的代码,创建了一个 元素类型仅限于String(字符串)类型的List。
    一种是元素类型可以是任意一种JAVA类的实体的 List (不限类型),一种是 元素类型仅限于String(字符串)类型的 List。两种List的类型当然不一样,故报错。

    方法 2 Object tt(){...}
    任何Java 子类的对象,都(可当作)是父类的对象。
    比如,Student extends Person, 那麽,任何一个具体的学生,当然都是人(Person)。
    方法 2 规定调用后返回 Object 类。
    实际返回了一个字符串对象。字符串对象,当然就是一个 Object 类的对象。因此,方法 2 没错。

                        <p>String是一个Object,但是List<String>却不是一个List<Object>。即String是Object的子类,但是List<String>却不是List<Object>的子类。List<String>和List<Object>都是List,没有继承关系,但是其限定的容器中可装的内容的类型不一致。故两者类型不匹配。</p>
    
                    
    
                            顶,解释的很到位
                        
    
                            这个才是答案。
                        
    
                            那Object[]跟String[]?
    
                        
    
                        <p>public Object [] initData() {<br>
    

         String [] dd = new String [10];
         return dd;
     }

    换成数组就不报错,

                        <p>很简单,泛型只在编译期有效果,可以理解为一个编译器的语法分析,只有在编译之后才会类型擦除。</p>
    
                    
    
                        <p>List<String> 与 List<Object>是两个类, 但是List<String> 是 List<? extends Object></p>
    
    2020-06-06 20:27:19
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载