public List<Object> initData() { List<String> stringList = new ArrayList<>(); return stringList; } public Object tt() { String s = "1"; return s; }
为啥上边这种就报错类型不匹配,下边这么写就不报错?
<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>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。