【发布时间】:2015-08-29 06:04:26
【问题描述】:
在下面的 sn-p 中,将“Hulooo”添加到列表中会产生编译器错误,因为 String 不扩展 String。 但是,对字符串的 ArrayList 进行类型转换是有效的。但是对对象的 ArrayList 进行类型转换是行不通的。
有人可以解释为什么会这样吗? 什么适用于字符串(在此上下文中)不适用于对象?
public static void takeList(List<? extends String> list)
{
list.add("Hulloo");//ERROR
list=new ArrayList<String>();
list=new ArrayList<Object>();//ERROR
}
【问题讨论】:
-
第一个错误是因为编译器不够聪明,无法意识到
String没有子类。您提供的list可能是List<SuperString>类型(如果SuperString以某种方式扩展String),在这种情况下,如果您设法添加一个普通的旧String,则会产生不一致。至于第二个错误,? extends Stringmenas "Stringor a subclass ofString",不是严格意义上的"subclass ofString",所以String符合描述,而Object不符合。跨度> -
谢谢。现在我明白了。但是您的意思是第一个错误是预期该列表可能具有 String 的子类对象,因此不允许添加?这很奇怪。如果它毕竟是一个字符串列表呢?
-
@Brindha
? extends String表示它可能是字符串,也可能不是。它可以是任何扩展的东西(即使它是final class)编译器不能让你做一些可能或可能不正确的事情。 -
你不能从
java.lang.String扩展...见docs.oracle.com/javase/8/docs/api/java/lang/String.html:public final class String extends Object implements Serializable, Comparable<String>, CharSequence